RTEMS版权所有,转载请注明:来源
http://www.rtems.net,作者 ray@rtems.net
%A
%A 摘要
%A
%A RTEMS提供了多种API,其中,基于C语言的RTEMS C 是最为强大,开发速度最快的API,但是这种API的使用和普通Linux的系统调用有很多不同。这节将介绍RTEMS C的一些基础知识。
%A
%A RTEMS提供的API是非常适合实时系统开发的一组API,这组API不但功能强大,执行效率高,而且能大大缩短代码量,从而减少开发周期。下面,我们将介绍这组API的基础知识。
%A 程序对象
%A
%A RTEMS的API和最早的面向对象的语言Ada有着千丝万缕的联系。Ada也是美国国防部开发的计算机语言,是最早的面向对象语言。RTEMS中很多部分最早是用Ada开发的。所以现在在系统中还有Ada的踪迹。RTEMS C的设计理念也参考了Ada。在RTEMS C 中,有对象的概念,并且RTEMS C提供了动态创建、删除、操纵对象的接口。这些对象包括任务、消息队列、通信旗语。RTEMS面向对象的本性使开发者更容易构建模块化的程序,大大增加了软件复用的几率。
%A
%A RTEMS中,所有对象都创建在当前根节点上,拥有一个标识ID和一个名称。名称一般是程序员为方便操作对象而命名的,他是一个无符号的32位数,通称是4个ASCII的字符。
%A
%A 例如,下面的例子中,创建了一个命为LITE的对象,rtems_build_name将‘L‘ ‘I‘ ‘T‘ ‘E‘四个字符转储在32位整形变量里面。
%A
%A rtems_object_name my_name;
%A my_name = rtems_build_name( ‘L‘, ‘I‘, ‘T‘, ‘E‘ );
%A
%A 当然使用4个字符代表对象,局限性是非常明显的,所以很多情况下,对象的名称直接使用32位无符号整数,比如:
%A
%A #define TASK_LITE 32
%A rtems_object_name my_name;
%A my_name = TASK_LITE;
%A
%A 对象的标识是全局唯一的32位整数1,通称用rtems_id表示,他包含了三个字段,对象类别、对象节点号和对象索引。最高6位是对象的类编号,接下来的10位是该对象的节点编号(分配的处理器编号),对于单处理器系统,这个编号是1。最右边的低16位是对象索引,对应着类中对象的编号。
%A
%A (注1:目前Tiny RTEMS中将rtems_id变成了16bit,这样就可以支持8bit,16bit处理器,例如AVR)
%A
%A 此外,RTEMS也为对象名称和对象ID维护了一个映射关系表,通过这个表,程序员可以通过对象的名称,取得对象的ID。
%A
%A 系统也提供获得ID中子段的API:
%A
%A rtems_unsigned32 rtems_get_class( rtems_id );
%A rtems_unsigned32 rtems_get_node( rtems_id );
%A rtems_unsigned32 rtems_get_index( rtems_id );
%A
%A rtems 使用对象控制块来管理对象。为了效率上的考虑,每种对象的对象控制块是不完全相同的。对象控制块中信息的条目和应用程序相关,通常用户可以在配置中规定对象控制块的内存空间大小。对象控制块也是在对象被创建的时候产生的,在对象被销毁的时候自动释放。除了用户自定义的扩展外,对象控制块是不能由用户直接控制的。
%A 进程通信与同步
%A
%A 多进程的管理和通信在实时嵌入式系统中的重要性是不言而喻的。实时嵌入式系统必须为应用程序提供下面的功能:
%A
%A *
%A 多个协作进程间的数据传输
%A *
%A 进程和ISR间的数据传输
%A *
%A 多个进程的同步
%A *
%A 进程和ISR间的同步
%A
%A RTEMS中大多数的管理单元都或多或少提供了一些进程管理与通信的子模块,但是下面的管理单元是专门提供进程通信控制的单元:
%A
%A *
%A 进程旗语
%A *
%A 消息对列
%A *
%A 事件
%A *
%A 信号
%A
%A 进程旗语管理单元提供了同步与互斥的模块用于管理共享资源。二进制信号旗语(0 .. 1信号量)和附加的优先级继承算法可以有效地防止优先级反转。消息队列管理单元支持进程通信和同步,事件管理单元提供了一个高性能的同步机制,信号管理单元一般只支持异步通信,所以通常用在异常处理模块中。
%A 时钟管理
%A
%A 在实时嵌入式系统中,时钟的重要性是不言而喻的。为了有效的进行开发,也需要有效的理解时钟的使用。在RTEMS中,时间的基本单位是滴哒。时钟滴哒的频率和应用程序有关,并且这个频率决定了实时性的粒度,并且也会影响所有和日期、时间相关的操作。当然,所有和时钟有关的操作,都必须由硬件的实时时钟提供。
%A
%A 通过读取时间值,RTEMS能支持和时间间隔相关的应用,比如任务延时、时间片、进程占用资源时间控制、单调周期进程调度等。在RTEMS中时间的间隔使用rtems_interval表示。他意味着两个时间点之间的滴哒数目。
%A
%A 使用时间间隔的时候需要注意,由于定时器启动需要占用一些CPU时间,所以可能导致一定程度的不精确,这个不精确在滴哒的粒度比较粗的时候对系统的影响会比较大。
%A
%A 单调周期调度算法是一种硬实时的调度方法。该方法确保了一些周期性的操作能够定期启动,并且能在规定的时间内完成(即使出现了短暂的CPU过载)。单调周期调度算法在很大程度上就依赖于时间管理模块。
%A
%A 由于上面所说的时间和人们日常所指的时间有区别,为了提供正确的日期,RTEMS也提供了日期和时间的相关操作。数据类型rtems_time_of_day就是为了提供该服务而设计的。
%A 内存管理
%A
%A RTEMS的内存管理可以分为两类:动态内存分配和地址索引与转换。动态内存分配用于程序在运行时内存需求不确定的情况。地址索引与转换在多CPU共享内存以及DMA操作的时候比较有效。RTEMS中提供下面的内存管理单元。
%A
%A *
%A 内存区管理(段式内存)
%A *
%A 内存分区管理
%A *
%A 双口内存管理
%A
%A RTEMS允许程序员为应用程序分配固定大小的内存池(分区管理),或者每块内存大小不固定的内存池(段式内存),双口内存管理则使为了管理片内和片外的双口内存。