RSS

操作系统读书报告浅谈Real-Time Linux

来源:网络 作者:匿名 时间:2007-01-06 Tag: 点击:

2. 系统实现

下面看一下NMT RT-Linux的实现方案及说明。分两部分来介绍,即进程管理、通讯和中断。

a.   进程管理

NMT RT-Linux的实时进程被设计为轻量级线程(LWT),它们作为实时统一调度的单位。

初期设计时实时任务被给予独立地址空间,而目前版本则是和Linux进程共享Linux的地址空间。这有两个原因:

1.    使用独立地址空间将会使TLB的命中率降低,影响效率;

2.    使用共享地址空间可以使得实时系统成为一个可动态加载的核心模块,这样使得Linux可以同时作为分时系统和实时系统。

同时Real-Time Linux提供了一组用于进程控制的系统调用,如下:

 

l        int RTLoad(const char *file)载入一个实时任务文件,创建一个进程并返回它的pID号,该进程被挂起直到执行RTRun

l        int RTRun(int pID)开始执行一个使用RTLoad载入的实时进程

l        int RTKill(int pID)销毁一个实时进程

l        int RTGet_Time(RTime *t)得到当前时间(一个64Bit整形值,为自系统启动后经过的时钟节拍数)

l        int RTSet_Params(RTime *start, RTime *period, int priority)改变一个进程的调度参数(优先级等)

l        int RTWait_Start(RTime *start, RTime *period, int priority)挂起进程,直到给定的起始时间,然后以指定的优先级继续进程的执行

l        int RTWait_Period()挂起进程,直到下一周期(period)

通过这些函数我们可以实现包括定时任务和中断驱动任务。这对于不是非常复杂的实时应用已经足够了。

在中断发生时(进程间的模式切换也需归结为中断的产生),Real-Time Linux不使用Intel x86提供的硬件切换机制(它保存了太多的状态从而使速度太慢),而只是把模式字保存到栈中,然后切换栈,这样可以使得中断延迟得到很大降低。实时进程的模式字仅仅包含整数寄存器,这样可以保证快速的模式切换。

在系统中使用了一个简单的基于优先级的强先式调度算法,它从就绪进程队列中选择一个最高优先级的进程,并使之成为下一个执行进程。任务自愿释放处理器,或者被一更高优先级的进程强占,通过这种方式使Linux从个时间片轮转的进程调度算法变成了强占式的进程调度算法。

b.   通讯

尽管由于Linux本身在NMT RT-Linux中是以最低的优先级运行,从而可以保证任何实时任务都可以中断Linux。所以实时任务中不能包含有Linux提供的系统调用(这将导致重入)。然而一些通讯机制还必须要提供。例如,在一个数据采集系统中,实时任务负责轮询端口,并将接收到的信息存入一个FIFO的缓冲区,而Linux进程而负责从该缓冲区中读出数据并显示(或保存到文件),在读写该缓冲区,必须禁止中断,所以系统必须提供一种共享数据区,当操作该数据时,中断被禁止。

在NMT RT-Linux中,系统有一些函数用于管理这些数据区(其中的数据被组织成FIFO形式,称为RT-FIFO),如下:

l        int RTFifo_Create(unsigned int fifo, int size)创建一个大小为size的RT-FIFO。

l        int RTFifo_Destroy(unsigned int fifo)销毁指定的RT-FIFO。

l        int RTFifo_Get(unsigned int fifo, char *buf, int count)从FIFO中读取count个字节到buf中。

l        int RTFifo_Put(unsigned int fifo, char *buf, int count)向FIFO中写buf中count个字节。

同时FIFO机制提供了一个实现信号灯的很好方法。两态信号灯可以通过创建一个大小为1的FIFO来实现,V操作即为RTFifo_Put(),数据内容无所谓,同时忽略返回的错误。P操作为RTFifo_Get()。计数信号灯可以通过创建大小足够容纳所期望V操作个数的FIFO简单地实现。由此可见,FIFO机制提供了实时应用中任务同步所需的大部分功能。当前的实现在RTOS用户习惯的某些功能上仍有欠缺,比如优先级禁止(防止优先级反转)和任务安全删除。但是仔细设计几乎总能避免这些问题。此外,虽然FIFO操作可以在没有数据(读FIFO)或没有空间(写FIFO)时阻塞,语法却相当复杂,阻塞能力看来不是设计的重点。然而,至少有一个提供FIFO阻塞操作简单语法的努力正在进行,同时还实现了阻塞超时,这是许多嵌入式应用的重要特征。RT-Linux简单、开放的设计允许用户相当容易地实现类似的附加功能。
1.部分资源来自网络,经ET电子归类整理,旨在服务电子爱好者并无商业目的,不保证正确性与完整性.
2.如果您觉得本站资源对您有用,请告知您的好友,用搜索引擎搜"ET电子"即可.


最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
教程下载