n函数开始运行时,内核 已经完成了低级别的设置:l 嵌入式处理器被切换到保护模式l 代码段和数据段选择器被设置为从 0 到 4 GB 的线性地址空间l 寄存器和标志位被初始化l 中断被使能l 全局变量从 ROM 的压缩数据中被初始化l 如果已经链接到应用程序,那么 C 运行库将被初始化 由于实时 ETS 内核自动完成了初始化,这极大地简化了嵌入式系统程序的开发难度。
譬如在程序中不必 再指定和管理系统资源(如描述符表)了。
C 运行库的支持 实时 ETS 内核支持大多数的 C 运行库函数。
不支持的函数一般都是调用嵌入式系统上不存在的资源。
在 实时 ETS 内核下 C 运行库的功能行为一般与 Windows 下相同。
但是。
两者之间也存在如下不同:l 默认情况下,应用程序能够得到所有可使用的 RAM。
在运行时,EtsCustomGetMemPool被用于在运行时动态 定位堆和定制堆的大小。
l 在系统创建时,环境变量和命令行是相互交织的l 当运行在 WaitHost 模式下,通过通讯电缆与主机的连接是支持文件 I/O 的,并且如果本地文件系统库已经 与应用程序链接,就会在本地的嵌入式系统支持。
l 当运行在 WaitHost 模式下,通过连到主机的通讯是支持屏幕/键盘 I/O 的,并且如果嵌入式处理器有屏幕和 键盘,并且装入的屏幕和键盘驱动已经与应用程序链接,就会在本地的嵌入式系统支持。
本地控制台可以被 WaitHost 和 NoWaitHost 两种模式支持。
l 在目标机上的定时器服务通过定时器驱动来支持。
使用 C 运行库可以大大简化程序开发,但同时也带来一定的副作用,嵌入式程序将因此变大。
如果不需 要 C 运行库提供的功能,可以用汇编语言编写一个入口程序调用 C 代码。
这样可以在 C 代码中不使用任何 C 运行库。
浮点仿真 大多数编译器并不提供浮点仿真库。
而是操作系统提供这种服务,因此在这种情况下实时 ETS 内核提供 这种服务. 默认情况下实时 ETS 内核并不包括浮点仿真。
如果嵌入式程序使用浮点操作,并且目标机没有协处理器, 则必须将仿真库与程序相链接。
若嵌入式系统有协处理器,即使仿真库存在,也使用协处理器来处理浮点操 作。
与开发机的通讯 实时 ETS 内核通讯的选项串口或并口提供大多数 WaitHost 运行模式的功能。
此选项允许通过 Visual Studio 调试应用程序,并提供对主机键盘、屏幕和文件系统的访问。
必须通过一个电缆连接开发机和嵌入式系统端口。
二者可以串口对串口连接,并口对并口连接,但不能串并 相连。
访问内存映射的设备 实时 ETS 内核设置 32 位数据段的描述符作为一个可向下扩展的地址选择器,基址为 4 GB,大小为 4 GB – 4K。
由于分页单元关闭,所有内存地址是物理地址。
这样程序通过一个 32 位的指针可以直接访问嵌入式系统 所有的物理内存,包括内存映射设备。
例如,若目标系统有一个视频显示,应用程序可以直接写屏幕的物理 地址。
使用一个向下扩展的地址选择器允许第一页内存被保护,从而引起 NULL 指针索引错误—这对开发和调 试 ETS 应用非常有帮助。
主机命令行和环境 嵌入式程序能够使用标准的 C 语言访问他们的命令行和环境变量。
命令行参数可以通过传统的 main函 数的 argc 和 argv 参数。
环境变量可以通过 getenv 和_putenv函数或 main函数的 envp 参数来访问。
_putenv的影响与 MS-DOS 中类似,调用 _putenv只改变了嵌入式程序运行周期内的环境。
对主机的环境 没有改变。
当实时 ETS 内核运行在 WaitHost 模式时,命令行包含了程序名字和带有的参数。
对 Visual Studio 来说, 参数在“Project Settings”设置,并且 argv0 是 ETS 程序名。
当 Visual Studio 启动程序时,环境中已经包含了所有主机上定义的环境变量。
也可以在 ETS RTOS.INI 配 置文件中指定命令行和环境变量。
在 NoWiatHost 模式下运行时,实时 ETS 内核调用 EtsCustomGetCommandLine 和 EtsCustomGetEnvStrings 函数指定命令行和环境变量的缺省值 。
如果在 RTOS.INI 文件中没有指定缺省值,上述函数将把命令行初始化为空白缺省值。
如果愿意,也可以改写这些函 数,提供合适的值。
同样的,在 ETS RTOS.INI 的Environment 部分也可以指定环境变量,每一行指定一 个变量,这些变量也可以通过 getenv 函数访问到。
可替代的代码 实时 ETS 内可以依据你的嵌入式硬件按你的需要来定制裁减。
一般来说,有两种定制方法:一些是通过 可选连接时的模块支持实现, 一些是通过可替代的代码实现。
若实时 ETS 内核包括必需的代码例如一个浮点 仿真库,你可以在链接时指定定制。
若适合你硬件的代码没有,你可以在实时 ETS 内核代替可以应用的模块 或可链接的库。
实时 ETS 内核的要点l 支持 Win32 API 实时 ETS 内核支持线程、事件、互斥体、信号量、临界区、可等待定时器和本地线程存储的 Win32 函数。
除此之外,我们也增加了实时 ETS 内核 API 函数的一些功能,允许你定制定时器和时间片的粒度。
l 单进程、多线程 Win32 API 支持多进程和多线程应用。
实时 ETS 内核支持单个进程的多线程程序。
在 ETS 应用中有单一进 程,所有的实时 ETS 内核线程共享同一个 32 位的线性地址空间。
l 实时 ETS 内核调度器 实时 ETS 内核的线程实现与 Windows 相比有明显的不同。
在实时 ETS 内核中,任务调度是非常确定的, 而在 Windows 系统中不是确定的。
l 最高优先级可运行线程将运行 高优先级的线程将一直运行直至被阻塞,较高优先级的线程才能运行,或者时间片使能,同等优先级的 线程被调度运行。
只要一个线程不正等待一个同步对象事件、互斥体、信号量、临界区、可等待定时器或 等待在 Sleep系统调用,他就是可运行的。
支持 256 个线程优先级。
函数 SetThreadPriority用于改变优 先级。
ETS 多任务库包含一个确定性的线程调度器。
从调度器的观点,每个线程有一个状态,它或者是可运行状 态或者是处于等待状态。
当任一线程状态改变时,调度器察看所有可运行线程来确定哪一个有最高的优先级, 以便最高优先级可运行的线程将运行。
有时一个线程的资源被一个没有运行的更低优先级的线程占用。
对于这个调度异常,我们称之为优先级 倒置处理。
它可能造成你应用程序非预期的和非确定的行为。
在实时 ETS 内核中的多任务调度器会阻止优先 级倒置处理产生的影响。
它自动观察优先级倒置并仔细地控制线程的优先级,允许更高优先级的线程运行。
l 时间片 时间片长度控制同等优先级线程切换的频率。
默认的时间片是 10 毫秒。
设置时间片长度为 0 将使时间片 不起作用。
ETS 库包含调整时间片长度的函数。
尽管没有说明,时间片长度应该是时间刻度的整数倍,以获得精确的时间片。
时间周期与硬件时钟的时 间成比例关系。
缺省的时间周期是 10 毫秒。
编程者可以根据程序的需要设置时间周期,时间周期越小,系统 中的 Sleep 和 Wait 调用就越准确。
l 可选择时钟计时周期 时间片的精度与硬件有关。
对于 PC/AT 型的机器,周期一般在 1 到 55 毫秒之间。
在 ETS API 中有亚毫 秒级计时器的函数。
但是较短的时间周期也是有代价的。
在某些性能较差的机器上,可能绝大多数 CPU 处理 时间都用来处理时间中断了。
可以选择缺省的 10 毫秒,可以达到比较好的性能。
在一台 20 MHz 的 386SX 机 器上,如果时间周期为 10 毫秒,则大约 5的 CPU 时间用来执行定时器中断。
在更快的 CPU 上这个百分比会 下降。
在那些机能足够强的机器上则可以尽量的提升定时器的精度而不影响应用程序的性能。
l 一个线程调度的例子 在最简单的情况
上一篇:
PSQL数据库操作
下一篇:
黑色的摄影网站展示功能强大网上少见js技术强悍