微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 利用RTLinux开发嵌入式应用程序的方案

利用RTLinux开发嵌入式应用程序的方案

时间:03-07 来源:互联网 点击:

用户进程和实时任务的连接提供了一种方便的机制,但将它们作为消息队列更适合。比如,一个实时线程可利用FIFO记录测试结果,然后用户进程就可读取该结果,并将之存入数据库文件。

许多数据采集应用程序涉及到内核及用户空间之间的大量数据。Linux内核v. 2.2.x并没有为这些空间的数据共享提供任何机制,但v. 2.4.0版本预计会包括kiobuf结构。为解决现有稳定内核的这个缺点,RTLinux包括mbuff驱动程序。该驱动程序可利用vmalloc()分配虚拟内核存储器的已命名存储器区域,它采用的存储器分配和页面锁定技巧跟大多数Linux中bttv帧抓取器驱动程序所用的一样。

更具体地说,mbuff一页一页地将虚拟内存锁定到实际的物理内存页面。任何实时或内核任务,或用户进程在任何时间都可访问该存储器。通过将虚拟内存页面锁定到物理内存页面,mbuff可确保所分配的页面永久驻留在物理内存,而且不会发生页面错误。换言之,当实时或内核进程访问所分配的存储器时,它可确保VMM不被调用。注意:由于实时任务执行期间实时Linux冻结标准内核的执行,任何对VMM的调用都会引起系统暂停。如果它要访问并不位于物理RAM内的虚拟存储页面,那么即使正常的Linux内核驱动程序也会引起系统故障。

由于mbuff是一种Linux驱动程序,其功能可通过设备节点/dev/mbuff实现。该节点可显示几个录入点,其中包括可将内核空间地址映射到用户空间的mmap()。它还可以利用录入点ioctl()来控制。然而,并不需要复杂的结构及直接调用ioctl。相反,mbuff可为ioctl()调用提供一个包裹,而且仅仅调用两个简单的功能即可配置和释放共享的存储缓冲器。

当然,不能从实时任务调用mbuff驱动程序,因为该驱动程序所调用的虚拟存储器分配功能本身是不确定性操作。分配共享存储器所需的时间依赖于主系统的存储器容量以及CPU速度、磁盘驱动器性能和存储器分配的现有状态。因此,只能从模块的Linux内核一侧来分配共享存储器,比如从init_module()或一个ioctl()请求开始。

那么,一个共享缓冲器到底能分配多少存储器呢?如果不是任务繁重的服务器或图形应用,建议至少为Linux保留8MB存储空间。为了获得优化的配置,可在限制存储器大小的同时测量实时应用程序的性能,以确定需要多少存储空间。

列表2给出了如何从实时任务和用户进程方面访问共享的存储器。内核模块和用户任务采用同样的功能集。当然,要想使用insmod mbuff.o,还必须将之置于Linux内核中。例如,mbuff_alloc(buf_name, size)可将符号名buf_name分配给一个缓冲器,而mbuff_free(buf_name, mbuf)可将之释放。

当第一次调用带有符号缓冲器名的mbuff_alloc()时,mbuff执行实际的存储器分配。而当从内核模块或用户进程再次调用该功能时,它只是简单地增加使用数(usage count)及将指针返回现有的缓冲器。每次调用mbuff_free()都会减少使用数,直至为零,这时mbuff就去分配带符号名的缓冲器。这种方法从多个内核模块和用户进程获得一个指向同一共享缓冲器的指针,从而解决了问题。它还可确保共享缓冲器一直有效,直到最后的应用程序释放它。请注意,是实时内核还是用户进程执行实际的buf1配置依赖于谁先获得控制权。

还有一个“笨”方法可在实时应用程序、内核模块和用户应用程序间共享存储器。对于嵌入式应用,该方法还是可以接受的。例如,如果PC带有128MB RAM,可将线搜索路径=mem=120m添加进lilo.conf文件(列表3)。当启动带有Linux内核和RTLinux 2.3的系统时,Linux仅使用120MB内存。OS也不用剩下的8MB内存(物理地址为0x7F00000到0x7FFFFFF),而是留给在OS下运行的各种任务共享。要想从用户进程获取存储器地址并访问预留的存储器,必须用O_RDWR访问模式来打开/dev/mem驱动程序,然后利用mmap()保留存储器(列表4)。而从实时模块或内核驱动程序一侧进行,则必须使用ioremap(0x7F00000, 0x100000)才能获取这8MB (0x100000字节)预留内存。

这种方法有利有弊。既不能通过预留内存的所有权,也不能通过读或写来获取控制权。正确地配置和释放大量内存的机制尚未问世。另外,无论实时进程是否需要,该内存都不能为Linux所用。

也许存储器共享笨方法的唯一适用场合是专为特定应用而定制的小型嵌入式系统,因为此时可为小型化而放弃使用mbuff驱动程序。

中断

RTLinux有两种中断:硬中断和软中断。软中断就是常规Linux内核中断,它的优点在于可无限制地使用Linux内核调用。这类中断作为硬中断处理的第二部分还是相当有用的(由参考文献5可获得更多有

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top