微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 硬实时操作系统-RTLinux

硬实时操作系统-RTLinux

时间:04-13 来源: 点击:

是实时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

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

网站地图

Top