Rtems--c_user--关键概念

 2.1引言

Rtems提供的方法都是基于一些十分重要的概念。在做应用开发之前,必须理解这些概念。这将有助于有效的利用Rtems。本章的目的就是让我们理解这些概念。

 

2.2对象

Rtems提供了函数可以用于创建、删除、操作预先定义好的对象类型。这些对象类型包括任务、消息、队列、信号量、存储区、定时器、端口、。Rtems面向对象的特性鼓励应用程序设计具备可复用、模块化等特点。

所有的对象都是应应用程序的需求在局部创建,由Rtems分配ID。所有的对象都有一个自己定义的名字。尽管对象的名字和ID之间存在着联系,名字和ID不是完全相同的。对象的名字是任意的,只是由用户自己定义,用于自己辨识的标签。但对象名的选取往往反映了其在应用程序中的用途。相反,对象的ID的建立是为了有效执行对象的操作。

 

2.2.1对象名

一个对象的名称是一个无符号32位...数据类型rtems_name用于存储对象的名字。

尽管Rtems不作要求,对象名常常由四位ASCII字符组成,用于鉴别不同对象。比如,一个任务是使灯闪烁的,那么它可以取名为“LITE”。rtems_build_name routine 程序是用来选取4个ASCII字符来起一个对象的名字。下面的例子做了具体阐述:

rtems_object_name my_name;

my_name = rtems_build_name( ’L’, ’I’, ’T’, ’E’ );

然而没有强制要求使用ASCII码字符来命名对象的名字。比如,有一个应用需要建立100个任务,那么为这么多的任务用ASCII码字符命名有意义的名字将比较困难。此时可以用更便利的方式进行命名。比如,可以用替代用1-100的二进制值。

Rtems提供了一个帮助程序rtems_object_get_name。他的作用是通过ID查询任意Rtems对象的名字。这个程序会试图将对象名转换成可打印的字符串。

下面的程序说明了用这个函数来打印一个对象名:

#include <rtems.h>

#include <rtems/bspIo.h>

void print_name(rtems_id id)

{

char buffer[10]; /* name assumed to be 10 characters or less */

char *result;

result = rtems_object_get_name( id, sizeof(buffer), buffer );

printk( "ID=0x%08x name=%s\n", id, ((result) ? result : "no name") );

}

 

2.2.2对象ID

2.2.2.1 32位对象ID格式

32位格式的对象ID,内容由四部分组成:API、对象类、节点、索引。数据类型rtems_id是用来存储对象ID的。

表 2.1: 32位对象ID格式

最重要的5位是描述对象类的5位。下面3位说明了对象类属于哪个API。下面8位是节点号,由对象创建。在单处理器系统中,节点号常常设为1。余下16位形成一个标识符...这个标识符叫做对象索引,其取值范围从1到对象配置表中设置的最大值。

2.2.2.2 16位对象ID格式

32位格式的对象ID,内容由三部分组成:API、对象类、索引。数据类型rtems_id是用来存储对象ID的。

表 2.2: 16位对象ID格式

16位格式的对象ID设置的尽可能类似于32位格式的对象ID。区别在于16位格式的对象ID没有节点域,索引域从16位减到了8位。因此,16位格式的对象ID仅仅支持,每个API/类只有255对象。另外,限用于单处理器系统。由于这个格式用于16位的处理器,因为处理器受到了地址空间的限制。由于,这种...

 

2.2.3对象ID描述

组件对象的ID使得就算在复杂的多处理器系统中获取任何的对象都是可以做到很快。对象的ID号与Rtems创建这个对象有关。相应ID是由适当的对象创建函数返回...

对象识别函数可以用于动态获取一个特定对象的ID,而只需给出它的对象名。这种映射是通过搜寻与对象类型相关的对象名表完成的。如果对象不唯一,这时首先出现的该对象名的ID将会被返回到应用程。因为,对象ID在对象创建时就返回了,因此在设计适当的单处理器应用程序里,对象识别函数是不需要的。

另外,有这样的功能,可以检查Rtems ID的子组件(API、CLASS...)

uint32_t rtems_object_id_get_api( rtems_id );

uint32_t rtems_object_id_get_class( rtems_id );

uint32_t rtems_object_id_get_node( rtems_id );

uint32_t rtems_object_id_get_index( rtems_id );

对象的控制块是由Rtems定义的数据结构,其包含了管理特殊对象类型的必要信息。出于效率的原因,各对象类型控制块的格式是不同的,然而他们的功能是相似的。各类型控制块的数量依赖于应用程序,由用户配置表中给定的变量值决定。对象控制块是在对象创建时分配的,在对象删除时释放。除了用户扩展例程,对象控制块不是由用户应用程序直接操控的。

 

2.3通信和同步

在实时多任务应用程序中,协调执行中的线程间通信和同步的能力是必备的。一个执行体必是一个提供了如下功能的应用:

在有合作的任务间传输数据

在任务和中断间传输数据

在有合作的任务间实现同步

在任务和中断间实现同步

大部分的Rtems的管理器都可以提供某种形式的通信和同步。然而管理器专注于某种通信和同步,提供一种建立好的机制直接用于满足不同应用程序的需要。这种程度的灵活性...下面的管理器是专门设计出来用于通信和同步的:

Semaphore

Message Queue

Event

Signal

信号量管理器支持信号相互排斥,包括获取一个或多个用户共享资源的同步。二进制信号量可以利用可选优先级继承算法避免优先级翻转。消息管理器支持通信和同步。事件管理器则在处理同步机制方面表现优异。信号管理仅支持异步通信,通常用于异常处理。

 

2.4时间

随着实时响应应用的发展,需要了解Rtems是如何保持和支持与时间相关的操作的。在Rtems中与时间基本单位是“滴答”。时钟“滴答”的频率是完全与应用相关的。确定粒度、时间和日历时间操作的准确性。

通过跟踪跟踪单位时间片,Rtems支持间隔定时功能,比如,任务延时、超时、时间片、延迟执行定时服务例程和单调速率调度任务。一个时间间隔被定义为许多时间片,相对于当前时间。比如,一个延时任务需要十个“滴答”的时间间隔,就表明,在十个“滴答”发生后任务不会被执行。所有的间隔都是通过数据类型rtems_interval规定的。

...

 

2.5内存管理

Rtems内存管理器可以分为两组:动态内存分配和地址传送。在应用程序执行过程中,那些内存需求变化的应用程序,需要动态分配内存。而地址传送是和其他cpu共享内存的应用程序中,或者是一个智能的输入输出处理器。下面是Rtems管理器提供的管理内存的方式:

Region

Partition

Dual Ported Memory

Rtems内存管理的特征是允许一个应用程序创建简单的固定尺寸的内存池,和/或复杂的尺寸可变的内存池。分区管理器提供了函数去管理和维护尺寸固定的内存池。比如,资源控制块。另外,区域管理器提供了一个更普遍的内存分配方案。支持尺寸变化的内存分配方案。双端口内存管理器提供在内部、外部双端口内存地址空间之间传送地址。

(转载请注明出处)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值