2022年硬实时操作系统-RTLinux .pdf
rtlinux:硬实时操作系统-RTLinux疯狂代码 http:/ ?:http:/ 摘要:介绍了 RTLinux两个重点特点:硬实时性和完备性及其在嵌入式系统应用中些重要功能并结合实时处理具体实例对其编程方法加以说明 ; ; ; 关键词:操作系统 实时处理 Linux 嵌入式系统 近年来基于 PC 嵌入式系统得到迅速发展在各种不同操作系统中由于Linux 操作系统廉价、源代码开放性以及系统稳定性使其在基于 PC 嵌入式系统中应用日益广泛RTLinux(RealTime Linux)1是种基于 Linux 实时操作系统是由FSMLabs 公司( Finite State Machine Labs Inc.)推出与 Linux 操作系统共存硬实时操作系统它能够创建精确运行符合 POSIX.1b标准实时进程;并且作为种遵循GPL v2协议开放软件可以达 GPL v2协议许可范围内自由地、免费地使用、修改和再发生本文介绍了RTLinux特点及功能并结合个实时处理具体实例对其编程方法加以说明 1 RTLinux 特点 在Linux 操作系统中调度算法(其于最大吞吐量准则)、设备驱动、不可中断系统、中断屏蔽以及虚拟内存使用等因素都会导致系统在时间上不可预测性决定了Linux 操作系统不能处理硬实时任务RTLinux为避免这些问题在Linux 内核与硬件之间增加了个虚拟层(通常称作虚拟机)构筑了个小、时间上可预测、与Linux 内核分开实时内核使得在其中运行实时进程满足硬实时性并且RTLinux和Linux 构成个完备整体能够完成既包括实时部分又包括非实时部分复杂任务 1.1 硬实时性 RTLinux将Linux 源码中所有 cli 、sti 、iret 指令分别用宏 S_CLI、S_STI、S_IRET 替换引入虚拟层将截取所有硬件中断分割 Linux 系统与硬件中断之间直接联系当RTLinux虚拟层接收到与实时处理有关硬件中断时立即启动执行相应实时中断服务;而接收到与实时处理无关中断时先保存相应信息等到RTLinux内核空闲时通过软中断传递给Linux 内核去处理这样就使得 RTLinux内核不受各种软、硬件中断影响不会造成时间上不可预测性同时又区别于其他实时处理方案它并未对操作系统内核作结构性修改因此并不会妨碍Linux 操作系统进步发展和变化 Linux 采用基于最大吞吐量准则调度策略并不能确保各个实时进程及时调度而RTLinux在缺省情况下采用优先级调度策略即系统调度器根据各个实时任务优先级来确定执行先后次序优先级高先执行优先级低后执行这样就保证了实时进程迅速调度同时RTLinux也支持其它调度策略如最短时限最先调度(EDP )、确定周期调度(RM )(周期短实时任务具有高优先级)RTLinux将任务调度器本身设计成个可装载内核模块用户可以根据自己实际需要编写适合自己调度算法 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 9 页 - - - - - - - - - 操作系统精确定时机制可以提高任务调度器效率但增加CPU 处理定时中断时间开销 RTLinux采用种折衷方案不将8354定时器设计成 10毫秒产生次定时中断固定模式而是根据最近事件(进程)时间需要不断调整定时器定时间隔这样既可以提供高精度时间值又避免过多增加CPU 处理定时中断时间开销 RTLinux系统同时将各时间间隔相加保持个系统全局时间变量并使用软中断方式来模拟传统100Hz 定时中断将其传递给 Linux 系统使用 1.2 完备性 过去实时操作系统仅是组原始、简单可执行它所做仅仅是向应用提供库但如今实时应用通常要求能够支持TCP/IP、图形显示、文件和数据库系统及其它复杂服务为了满足当今实时应用多种需求通常采用在实时控制内核上增加这些服务或完全修改标准操作系统内核方法而RTLinux所采用是种新型高效方式将个简单小型实时内核与Linux 内核共存用简单小型实时内核处理实时任务将非实时任务交给Linux 内核去处理而 Linux 内核本身也作为个RTLinux实时内核在空闲时运行进程这种将实时系统和平均时间优化标准Linux 操作系统协同工作方式使得许多实时应用都显示出种增效实时内核中实时任务可以直接访问硬件不使用虚拟内存给实时进程提供了很大灵活性;运行在 Linux 用户空间中非实时任务可以方便地使用系统提供各种资源(网络、文件系统等)并受到系统保护增加了系统安全性 2 RTLinux 主要功能 RTLinux提供了整套对硬实时进程支持集在此仅对在嵌入式系统中最重要三个方面:进程间通讯、中断和硬件设备访问以及线程间同步加以阐述 2.1 进程间通信( IPC) RTLinux要求将应用分成实时部分和非实时部分应用实时部分应该是简单和轻负荷在RTLinux实时内核中完成;而非实时部分在 Linux 用户空间完成因此 RTLinux提过了多种内核实时进程和Linux 用户空间进程间通讯机制最重要是实时 FIFO和共享内存 实时FIFO是能够被内核实时进程和Linux 用户空间进程访问快进快出队列是种单向通讯机制可以通过两路实时FIFO构成双向数据交换方式在使用实时FIFO前先要对实时 FIFO通道化: # rtf_create(unsigned fo, size) 使用后应该注销实时 FIFO通道: 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 9 页 - - - - - - - - - rtf_destroy(unsigned fo) 在化实时 FIFO通道后 RTLinux内核实时进程和 Linux 用户空间进程都可以使用标准POSIXopen 、read、write 和close 等对实时 FIFO通道进行访问内核实时进程还可以使用RTLinux专有rtf_put和rtf_get对实时 FIFO通道进行读写 RTLinux共享内存由 mbuff.o 模块支持可以使用下面分配和释放共享内存块: # void *mbuff_alloc(const char *name, size) void mbuff_free(const char *name,void *mbuf) mbuff_alloc 有两个参数共享内存名 name 和共享内存块大小 size 如果指定内存共享名并不存在分配成功时返回共享内存指针访问计数置为1分配失败时返回空指针;如果指定内存共享名已经存在返回该块共享内存指针并将访问计数值直接加 1mbuff_free 将该块共享内存访问计数值减1当计数值为 0时该共享内存被释放在实时内核模块中使用该时应该将 mbuff_alloc 和mbuff_free 分别放在 init_module 和cleanup_module模块之中 2.2 中断和访问硬件 硬中断(实时中断)具有最低延时在系统内核中只有少数实时进程使用rtl_request_irq和rtl_free_irq用于安装和卸载指定硬件中断中断服务 # rtl_request_irq(unsigned irq,unsigned (*handler)(unsigned ,struct pt_regs *) rtl_free_irq(unsigned irq) 中断驱动线程可以使用唤醒和挂起: pthread_wakeup_np(pthread_t thread) pthread_suspend_np(void) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 9 页 - - - - - - - - - 个中断驱动线程可以 pthread_suspend_np(pthread_self)阻塞自身线程执行然后由中断服务pthread_wakeup_np唤醒该线程换行直到此线程再次pthread_suspend_np(pthread_self()) 将自身挂起 软中断是 Linux 内核常常使用中断它能够更安全地系统无论如何对于许多任务来说并不能提供硬实时性能将会导致定延时 Int rtl_get_soft_irq(void (*handler)(,void*,struetpt_regs )const char* devname)分配个虚中断并安中断;void rtl_free_soft_irq(unsigned irq)释放分配虚中断 RTLinux与Linux 样通过 /dev/mem设备访问物理内存具体由模块rtl_posixio.o提供此项功能首先应用应该打开/dev/mem设备通过 mmap 对某段物理内存进行映射后即可使用映射后地址访问该段物理内存应用只能在Linux 进程中(即在应用 init_module 模块中) mmap 在实时进程中 mmap 将会失败另种访问物理内存方法是通过Linux 将会失败另种访问物理内存方法是通过Linuxioremap (2)RTLinux访问I/O 端口如下(对于 x86结构): 输出个字节到端口: # void outb(unsigned value,unsigned port) void outb_p(unsigned value,unsigned port) 输出个字到端口: # void outw(unsigned value,unsigned port) void outw_p(unsigned value,unsigned port) 从端口读个字节: # char inb(unsigned port) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 9 页 - - - - - - - - - char inb_p(unsigned port) 从端口读个字: # inw(unsigned port) inw_p(unsigned port) 其中带后缀 _p使读写端品时有个小延时这在快速计算机访问慢速ISA设备时是必需 2.3 线程同步 当多个实时线程需要访问共享资源时如果没有种同步机制将破坏共享资源中数据完整性RTLinux提供种简单加锁方法 mutex来控制对共享资源存取并支持POSIXpthread_mutex_family 组3 目前有以下可以使用: pthread_mutexattr_getpshared /得到指定属性线程共享属性值; pthread_mutexattr_pshared /设置指定属性线程共享属性值; pthread_mutexattr_init /化mutex属性; pthread_mutexattr_destroy /删除mutex属性; pthread_mutexattr_type /设置mutex信号类型; pthread_mutexattr_gettype /得到mutex信号类型; pthread_mutex_init /按指定属性化 mutex; pthread_mutex_destroy /删除给定 mutex; pthread_mutex_lock /锁定mutex,如果mutex已被锁定阻塞当前线程直到解锁; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 9 页 - - - - - - - - - prhread_untex_trylock /锁定mutex,如果mutex已被锁定立即返回; pthread_untex_unlock /解锁mutex; 互斥信号类型有 PTHREAD_MUTEX_NORMAL(default POSIXmutexes)PTHREAD_MUTEX_SPINLOCK(spinlocks ) 3 RTLinux 编程实例分析 下面结合个具体 parport.c4对RTLinux编程特点加以说明 parport.c中实时线程在并口 2、3脚(并口数据 D0 和D1 )上周期输出信号 1而对应硬件中断 7实时中断服务将在并口 2、3脚输出信号 0连接并口 2脚和10脚(并口确认信号线对应于计算机中断7)则可在并口 2、3脚上产生个方波信号 parport.c源如下: # # # # # # pthread_t thread; unsigned r_handler(unsigned irq,struct pt_regs *regs) ; /中断服务 outb(0,0 x378); /输出字节 0到并口数据线 rtl_hard_enable_irq(7); /使能硬件中断 7 0 ; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 9 页 - - - - - - - - - void * start_routine (void *arg) /实时线程 struct sched_param p; /定义实时线程控制参数数据结构 p.sched_priority = 1; /设置优先级为 1 pthread_schedparam (pthread_self,SCHED_FIFO,&p); /设置实时线程控制参数 pthread_make_periodic_np(pthread_self,gethrtime,100000); / 启动周期为 10ns实时线程 while (1) pthread_wait_np ; / 实时线程挂起 outb(3,0 x378); /实时线程周期执行输出 3到并口数据线 0 ; init_module(void) /化模块 status; rtl_irqstate_t f; /保存当前中断状态标志到变量f 并禁止中断 status=rtl_request_irq(7,irtr_handler); /设置硬件中断 7处理 rtl_prf(rtl_request_irq:%d,status); /输出控制台 outb_p(inb_p(0 x37A) |0 x10,0 x37A); /使能并口中断(硬件上) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 9 页 - - - - - - - - - rtl_hard_enable_irq(7); /使能中断 7(软件上) rtl_restore_errupts(f); /按照变量 f 恢复当前中断状态标志并使能中断 pthread_create (&thread,NULL,start_routine0); / 创建实时进程 thread void cleanup_module(void) /清除模块 rtl_free_irq(7); /禁止中断 7 pthread_delete_np(thread); /删除实时进程 thread parport.cmake 文件如下: all :parport.o rtl.mk clean : rm -f *.0 按照如下命令对进行编译: make 运行对采用以下命令: modprobe rtl_sched /调入所需处理模块 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 9 页 - - - - - - - - - insmod parport.o /调入parport.o 模块 连接并口 2脚和10脚即可通过示波器在并口3脚上观测到输出方波信号 可以看到 RTLinux实时被编写成可加载 Linux 内核模块它能被动态地加入内存不能执行Linux 系统模块化代码对实时任务结构作化把实时任务时限、周期和释放时间等实时参数传递给RTLinux 通过对 Linux 最小改动提供种可靠且廉价硬实时操作系统RTLinuxRTLinux开发者可以充分利用 Linux 提供各种方便来编写任务非实时部分加速自己任务进度目前RTLinux最新版本为 3.1 支持Linux2.4 内核源代码可以通过网站http:/www.rtlinux.org/免费下载 2008-12-12 15:58:02 疯狂代码 http:/ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 9 页 - - - - - - - - -