快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

新蒲京澳门赌场网站:RTOS设备驱动向嵌人式Linux的移植



Linux狂风雨般攻克了嵌入式系统市场。阐发财指出,大年夜约有1/3到1/2的32/64位新的嵌入式系统设计采纳了Linux。嵌入式 Linux 已经在很多利用领域显示出上风,比如SOHO家庭收集和成像/多功能外设。在(NAS/SAN)存储,家庭数字娱乐(HDTV/PVR/DVR/STB),和手持设备/无线设备,分外是数字移动电话更得到大年夜幅度成长。

嵌入式Linux新利用不会凭空从开拓者的头脑中冒出来,大年夜部分项目都是由成千上万行,以致数百万行的代码组成。成千上百的嵌入式项目已经成功地将现有的其它平台的代码移植到Linux下,比如Wind River VxWorks 和 pSOS, VRTX, Nucleus 和其它RTOS。这些移植事情有侧紧张的代价和现实意义。

到今朝为止,大年夜多半关于移植已有的RTOS利用到嵌入式Linux的文献,关注RTOS 接口(API)、义务、调整模式以及如何将他们映射到响应得用户空间去。同样紧张的是,在I/O调用密集的嵌入式法度榜样中若何将RTOS的硬件接口代码移植到加倍规范的Linux设备驱动法度榜样中去。

本文将概述几种常用的常常呈现于现有嵌入式利用中的内存映射I/O措施。它们涵盖的范围从对中断办事例程的特殊应用及用户线程对硬件造访到呈现于有些ROTS中的半规范化驱动法度榜样模型。这对付移植RTOS 代码到规范化的Linux设备启动法度榜样具有必然启迪生发火用,并且先容了一些移植措施。分外埠,本文会重点评论争论RTOS和Linux中的内存映射,基于I/O调整行列步队的移植,将RTOS I/O重定义到Linux下的驱动法度榜样和守护进程里。

RTOS I/O 观点

“不规范”是描述大年夜多半RTOS系统I/O的最佳词语。多半RTOS是针对较早的无MMU的CPU而设计,以是轻忽了内存治理部分,纵然当MMU问世后也是这样:不区分物理地址和逻辑地址。大年夜多半 RTOS还整个运行在特权模式,虽然外面上看来是增强了机能。整个的RTOS 利用和系统代码都能够造访全部地址空间、内存映射过的设备、以及其他I/O操作。这样,纵然存在区别,也是很难把RTOS利用法度榜样代码同驱动法度榜样代码区分开来。

不规范的布局导致了I/O实现的特殊性。在很多环境下,短缺设备驱动法度榜样模型的认同。根据这种无层次的特点,回首一下基于RTOS软件中应用的一些紧张观点和习惯用法异常有指示意义。

内嵌的内存造访

上个世纪八十年代中期商业化的RTOS产品中,多半嵌入式软件都有一个对新蒲京澳门赌场网站履行光阴有严格需求的,采纳I/O查询和中断办事例程的大年夜轮回。开拓职员在项目采纳RTOS和履行法度榜样,主要为了加强并行性和多义务同步,绕开其它有碍实现该目标的法度榜样布局。这样,纵然RTOS供给了I/O 调用形式化措施,嵌入式法度榜样员继承应用直接的I/O操作:

#define DATA_REGISTER 0xF00000F5

char getchar(void) {

return (*((char *) DATA_REGISTER)); /* read from port */

}

void putchar(char c) {

*((char *) DATA_REGISTER) = c; /* write to port */

}

多半受过练习的开拓者常会将这样的直接I/O代码从硬件代新蒲京澳门赌场网站码平分分开来。然则我照样常常看到诸如斯类的I/O调用代码。

当开始应用直接内存映射I/O的时刻,新打仗Linux的嵌入式开拓职员老是想把这类代码移到用户空间,经由过程mmap()调用来替代定义寄存器地址的#define 语句。这种处置惩罚措施对付一些原型是可以的,但不能支持中断处置惩罚,限定了实时相应,分外不安然,不得当商业化产品的宣布。

RTOS 中断办事例程

在 Linux里, 中断办事属于内核层; 在一个 RTOS里, 中断办事例程代码没有特殊规定且常与利用法度榜样代码没什么差别(不外乎返回序列异同)。很多 RTOS供给系统调用或者宏来让代码自己检测它自己的切换状态(比如 Wind River VxWorks的 intContext())。中断办事例程平日也应用标准的库函数,随之而来也有可重入性和移植性等问题。

· 一个或者多个利用义务从行列步队读消息掏出数据

传统的RTOS和Linux的范例I/O对照

输出经常由类似的机制来完成-代替write()或新蒲京澳门赌场网站者相似的系统调用,一个或者多个RTOS义务,将数据放进行列步队.行列步队中的数据由以下几种历程掏出:一个I/O法度榜样或者相应“筹备好发送”中断的中断办事例程,一个系统时钟,或者其它壅闭在取数据行列步队中的利用义务,然后履行I/O操作(可所以轮询,也可所以经由过程 DMA).

将RTOS I/O 映射到 Linux中

上面描述的基于行列步队的临盆者/破费者I/O模型,仅仅是传统多种设计中所采纳的分外措施的一种。让我们继承用这个直接的例子,来评论争论几种在嵌入式Linux下的实现措施:

大年夜规模移植到用户空间

对付只是初步懂得Linux设备驱动设计,或者没有履历的开拓者,可能将大年夜多半这种基于行列步队的法度榜样原封不动地移植到用户空间。在这种驱动法度榜样映掷中,内存映射经由过程函数mmap()供给的指针可以在用户空间操作物理I/O接口。

#include

#define REG_SIZE 0x4 /* device register size */

#define REG_OFFSET 0xFA400000

/* physical address of device */

void *mem_ptr; /* de-reference for memory-mapped access */

int fd;

fd=open("/dev/mem",O_RDWR); /* open physical memory (must be root) */

mem_ptr = mmap((void *)0x0, REG_AREA_SIZE, PROT_READ+PROT_WRITE,

MAP_SHARED, fd, REG_OFFSET)新蒲京澳门赌场网站;

/* actual call to mmap() */

一个进程下的用户线程运行类似RTOS的中断办事例程或延时义务一样的操作,然后应用SVR4进程间通信函数msgsnd()将消息放进行列步队,等待被另一个本地线程或者另一个进程使用函数msgrcv()获取。

移植的基础观点轻易理解,问题主要呈现在细节上。最常见的是RTOS中的利用法度榜样接口以及若何把它们保留到linux布局中继承应用。

整体阐发―重构

要是项眼光阴要求不是很紧,并且为了将来项目的可重用和代码可移植性,你会化光阴阐发当前RTOS利用法度榜样布局以及如何将他们映射到Linux中去。对付RTOS利用,必要斟酌将义务对应逐一映射到Linux基于进程的线程中去,或者斟酌将RTOS利用重分配到多个Linux进程中去。基于这些斟酌,应该从新斟酌将RTOS进程间通信(IPC)用相宜的进程间或者进程内通讯来替代。

在驱动法度榜样上,肯定要把不规范的内嵌式RTOS代码转化成响应的驱动法度榜样。假如已有的利用法度榜样已经很好划分,或者应用RTOS I/O利用法度榜样接口,或者分隔在不合的层面,转化事情将异常轻易进行。假如这类I/O代码分散于全部利用法度榜样中,将面临伟大年夜事情量。

基于API的措施

对付急于开脱旧RTOS,或者考试测验将原型综合在一路的开拓者, 更倾向于将很多RTOS映射或者转化为相称Linux API。法度榜样的接口险些是透明的(兼容的API,IPC,系统数据类型等)。另外部分可以经由过程用#define 从新定义和应用宏来办理。剩下的部分必要从新编码,作为完备抽象层的一部分。

经由过程应用仿真库-很多商业嵌入式Linux都带有(比如我们公司的针对Wind River VxWorks 和 pSOS的仿真库),新蒲京澳门赌场网站或者应用第三方公司供给的API映射包,比如MapuSoft,能够使你在移植基于API的法度榜样时有优越的起头。

移植RTOS代码和API 到Linux的多叉措施

大年夜多半项目采纳混杂的措施,映射所有兼容的或者轻易转化的API,从新设置设置设备摆设摆设那些对运行速率有要求的部分,从新编写残剩的部分代码直到编译经由过程和可以运行径止。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: