硬实时操作系统-RTLinux
是实时FIFO和共享内存。
实时FIFO是能够被内核实时进程和Linux用户空间进程访问的快进快出队列,是一种单向的通讯机制,可以通过两路实时FIFO构成双向的数据交换方式。在使用实时FIFO前先要对实时FIFO通道初始化:
#include
int rtf_create(unsigned int fifo, int size)
使用后应该注销实时FIFO通道:
int rtf_destroy(unsigned int fifo)
在初始化实时FIFO通道后,RTLinux内核的实时进程和Linux用户空间的进程都可以使用标准的POSIX函数open、read、write和close等对实时FIFO通道进行访问。内核实时进程还可以使用RTLinux的专有函数rtf_put和rtf_get对实时FIFO通道进行读写。
RTLinux共享内存由mbuff.o模块支持,可以使用下面的函数分配和释放共享内存块:
#include
void *mbuff_alloc(const char *name, int size)
void mbuff_free(const char *name, void *mbuf)
函数mbuff_alloc有两个参数,共享内存名name和共享内存块的大小size。如果指定的内存共享名并不存在,分配成功时返回共享内存指针,访问计数置为1,分配失败时返回空指针;如果指定的内存共享名已经存在,返回该块共享内存的指针,并将访问计数值直接加1。函数mbuff_free将该块共享内存的访问计数值减1,当计数值为0时,该共享内存被释放。在实时内核模块中使用该函数时,应该将函数mbuff_alloc和 mbuff_free分别放在init_module 和cleanup_module模块之中。
2.2 中断和访问硬件
硬中断(实时中断)具有最低的延时,在系统内核中只有少数的实时进程使用。函数rtl_request_irq和rtl_free_irq用于安装和卸载指定硬件中断的中断服务程序。
#include
int rtl_request_irq(unsigned int irq, unsigned int
(*handler) (unsigned int, struct pt_regs *))
int rtl_free_irq(unsigned int irq)
中断驱动的线程可以使用唤醒和挂起函数:
int pthread_wakeup_np(pthread_t thread)
int pthread_suspend_np(void)
一个中断驱动的线程可以调用函数pthread_suspend_np(pthread_self())阻塞自身线程的执行,然后由中断服务函数调用函数pthread_wakeup_np唤醒该线程的执行,直到此线程再次调用函数pthread_suspend_np(pthread_self())将自身挂起。
软中断是Linux内核常常使用的中断,它能够更安全地调用系统函数。无论如何,对于许多任务来说并不能提供硬实时性能,将会导致一定的延时。
int rtl_get_soft_irq(void (*handler)(int, void*, struct pt_regs *), const char* devname)分配一个虚中断并安装中断处理函数;void rtl_global_pend_irq(int ix) 激活虚中断;void rtl_free_soft_irq(unsigned int irq) 释放分配的虚中断。
RTLinux与Linux一样通过/dev/mem设备访问物理内存,具体由模块 rtl_posixio.o 提供此项功能。首先应用程序应该打开/dev/mem设备,通过函数mmap对某段物理内存进行映射后,即可使用映射后的地址访问该段物理内存。应用程序只能在Linux进程中(即在应用程序的init_module()模块中)调用mmap,在实时进程中调用mmap将会失败。另一种访问物理内存的方法是通过Linux的函数ioremap[2]。RTLinux 访问I/O端口的函数如下(对于x86结构):
输出一个字节到端口:
#include
void outb(unsigned int value, unsigned short port)
void outb_p(unsigned int value, unsigned short port)
输出一个字到端口:
#include
void outw(unsigned int value, unsigned short port)
void outw_p(unsigned int value, unsigned short port)
从端口读一个字节:
#include
char inb(unsigned short port)
char inb_p(unsigned short port)
从端口读一个字:
#include
short inw(unsigned short port)
short inw_p(unsigned short port)
其中带后缀_p的函数使读写端口时有一个小的延时,这在快速的计算机访问慢速的ISA设备时是必需的。
2.3 线程同步
当多个实时线程需要访问共享资源时,如果没有一种同步机制,将破坏共享资源中数据的完整性。RTLinux提供一种简单的加锁方法mutex来控制对共享资源的存取,并支持POSIX的pthread_mutex_ family函数组[3]。目前有以下函数可以使用:
pthread_mutexattr_getpshared //得到指定属性线程共享属性值;
pthread_mutexattr_setpshared //设置指定属性线程共享属性值;
pthread_mutexattr_init //初始化mutex的属性;
pthread_mutexattr_destroy //删除mutex的属性;
pthread_mutexattr_settype //设置mutex信号的类型;
pthread_mutexattr_gettype //得到mutex信号的类型;
pthread_mutex_init //按指定的属性初始化mutex;
pthread_mutex_destroy //删除给定的mutex;
pth
- 简介RTLinux下的一种实时应用通信机制(05-15)
- RTlinux的介绍(08-15)
- 基于RTLinux的软件无线电侦察预处理系统(05-15)
- 利用RTLinux开发嵌入式应用程序的方案(03-07)