⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000002.htm

📁 一份很好的linux入门资料
💻 HTM
字号:
<HTML><HEAD>  <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人:&nbsp;xog&nbsp;(雪剑心),&nbsp;信区:&nbsp;Linux&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>标&nbsp;&nbsp;题:&nbsp;RTLinux简介(2)&nbsp;<BR>发信站:&nbsp;BBS&nbsp;水木清华站&nbsp;(Thu&nbsp;Jan&nbsp;13&nbsp;19:45:43&nbsp;2000)&nbsp;<BR>&nbsp;<BR>1.3&nbsp;中断处理&nbsp;<BR>&nbsp;&nbsp;&nbsp;RTLinux&nbsp;中重写了Linux中断处理过程,当程序用cli屏蔽中断时,RTLinux只是清软&nbsp;<BR>中断表的全局标志,并不影响中断的发生。当中断发生时,实时核心接收中断,进行实&nbsp;<BR>时处理工作后,把中断控制权传给Linux核心,并产生软返回,如无其他软中断,则中&nbsp;<BR>断返回,否则由Linux处理最高优先级中断。因此可以看出,Linux程序的屏蔽中断&nbsp;<BR>(cli)并不能影响实时中断的发生,实时中断的延迟时间也完全由实时核心的处理速&nbsp;<BR>度决定。&nbsp;<BR>1.4&nbsp;RTLinux&nbsp;应用程序结构分析&nbsp;<BR>&nbsp;&nbsp;&nbsp;设计RTLinux的应用程序,应首先分析应用系统的特点,把应用中实时要求最高的部&nbsp;<BR>分和普通的处理部分分开,前者代码应尽可能短,对系统资源要求少,可把此部分用实&nbsp;<BR>时任务实现,剩余部分仍由普通Linux完成,可进行网络、图形界面等实时要求不高,占&nbsp;<BR>用系统资源较大的工作。RTLinux的实时任务模块采用Linux的可装载模块(Loadable&nbsp;&nbsp;<BR>modules)技术实现,可实现动态的加载和删除。&nbsp;<BR>1.4.1&nbsp;RTLinux的实时进程和Linux普通进程的IPC机制&nbsp;<BR>&nbsp;&nbsp;&nbsp;RTLinux的实时进程和Linux普通进程之间通过RT-fifo通信。&nbsp;<BR>&nbsp;&nbsp;&nbsp;以下例程中,共定义了三个fifo,其中两个为数据fifo,一个为控制命令fifo,两个&nbsp;<BR>实时任务分别向两个fifo发送数据,而在主程序中由普通的进程接收数据并打印。实时&nbsp;<BR>任务在可装载模块中实现,代码如下:&nbsp;<BR>#include&nbsp;&lt;linux/module.h&gt;&nbsp;<BR>#include&nbsp;&lt;linux/kernel.h&gt;&nbsp;<BR>#include&nbsp;&lt;linux/version.h&gt;&nbsp;<BR>#include&nbsp;&lt;linux/errno.h&gt;&nbsp;<BR>#include&nbsp;&lt;linux/cons.h&gt;&nbsp;<BR>#include&nbsp;&lt;rtl_sched.h&gt;&nbsp;/*所有的实时程序必须包含RTLinux的头文件*/&nbsp;<BR>#include&nbsp;&lt;rtl_fifo.h&gt;&nbsp;<BR>#include&nbsp;&quot;control.h&quot;&nbsp;&nbsp;/*自定义的fifo消息结构和命令*/&nbsp;<BR>RT_TASK&nbsp;tasks[2];&nbsp;&nbsp;&nbsp;&nbsp;/*定义两个实时任务变量*/&nbsp;<BR>static&nbsp;char&nbsp;*data[]&nbsp;=&nbsp;{&quot;xgl_1&nbsp;&quot;,&nbsp;&quot;xgl_2&nbsp;&quot;};/*定义实时任务要发送的数据*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*数据必须静态分配,实时任务不可访&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;问动态内存*/&nbsp;<BR>/*&nbsp;t&nbsp;--&nbsp;the&nbsp;fifo&nbsp;number&nbsp;*/&nbsp;<BR>/*实时任务的程序代码,实现向fifo发送数据的功能*/&nbsp;<BR>void&nbsp;fun(int&nbsp;t)&nbsp;{&nbsp;<BR>&nbsp;while&nbsp;(1)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;rtf_put(t,&nbsp;data[t&nbsp;-&nbsp;1],&nbsp;6);&nbsp;<BR>&nbsp;&nbsp;rt_task_wait();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*发送完数据后等待下次调度*/&nbsp;<BR>&nbsp;}&nbsp;<BR>}&nbsp;<BR>/*每次向fifo写入数据时,可定义自动处理函数,由系统自动调用,当主程序向命令fi&nbsp;<BR>fo&nbsp;<BR>发送命令时,由系统自动调用以下处理函数处理命令*/&nbsp;<BR>int&nbsp;my_handler(unsigned&nbsp;int&nbsp;fifo)&nbsp;<BR>{&nbsp;<BR>&nbsp;struct&nbsp;my_msg_struct&nbsp;msg;&nbsp;<BR>&nbsp;int&nbsp;err;&nbsp;<BR>&nbsp;RTIME&nbsp;now;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;((err&nbsp;=&nbsp;rtf_get(3,&nbsp;&amp;msg,&nbsp;sizeof(msg)))&nbsp;==&nbsp;sizeof(msg))&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(msg.command)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;case&nbsp;START_TASK:/*启动实时任务*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;now&nbsp;=&nbsp;rt_get_time();&nbsp;<BR>&nbsp;&nbsp;&nbsp;rt_task_make_periodic(&amp;tasks[msg.task],&nbsp;now,&nbsp;msg.period);&nbsp;<BR>&nbsp;&nbsp;&nbsp;break;&nbsp;<BR>&nbsp;&nbsp;&nbsp;case&nbsp;STOP_TASK:/*停止实时任务*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rt_task_suspend(&amp;tasks[msg.task]);&nbsp;<BR>&nbsp;&nbsp;&nbsp;break;&nbsp;<BR>&nbsp;&nbsp;&nbsp;default:&nbsp;<BR>&nbsp;&nbsp;&nbsp;return&nbsp;-EINVAL;&nbsp;<BR>&nbsp;&nbsp;}&nbsp;<BR>&nbsp;}&nbsp;<BR>&nbsp;if&nbsp;(err&nbsp;!=&nbsp;0)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;return&nbsp;-EINVAL;&nbsp;<BR>&nbsp;}&nbsp;<BR>&nbsp;return&nbsp;0;&nbsp;<BR>}&nbsp;<BR>int&nbsp;init_module(void)&nbsp;/*可装载模块初始化,当装载时自动执行*/&nbsp;<BR>{&nbsp;<BR>&nbsp;int&nbsp;c[3];&nbsp;<BR>&nbsp;rtf_destroy(1);&nbsp;/*删除旧的fifo*/&nbsp;<BR>&nbsp;rtf_destroy(2);&nbsp;<BR>&nbsp;rtf_destroy(3);&nbsp;<BR>&nbsp;&nbsp;c[0]&nbsp;=&nbsp;rtf_create(1,&nbsp;4000);/*初始化三个RT-fifo*/&nbsp;<BR>&nbsp;c[1]&nbsp;=&nbsp;rtf_create(2,&nbsp;4000);&nbsp;<BR>&nbsp;c[2]&nbsp;=&nbsp;rtf_create(3,&nbsp;100);&nbsp;&nbsp;/*&nbsp;input&nbsp;control&nbsp;channel&nbsp;*/&nbsp;<BR>&nbsp;printk(&quot;Fifo&nbsp;return&nbsp;1=%d&nbsp;2=%d&nbsp;3=%d\n&quot;,c[0],c[1],c[2]);&nbsp;<BR>&nbsp;rt_task_init(&amp;tasks[0],&nbsp;fun,&nbsp;1,&nbsp;3000,&nbsp;4);/*实时任务初始化*/&nbsp;<BR>&nbsp;rt_task_init(&amp;tasks[1],&nbsp;fun,&nbsp;2,&nbsp;3000,&nbsp;5);&nbsp;<BR>&nbsp;rtf_create_handler(3,&nbsp;&amp;my_handler);&nbsp;/*指定fifo处理函数*/&nbsp;<BR>&nbsp;return&nbsp;0;&nbsp;<BR>}&nbsp;<BR>void&nbsp;cleanup_module(void)&nbsp;/*模块删除处理*/&nbsp;<BR>{&nbsp;<BR>&nbsp;rtf_destroy(1);&nbsp;&nbsp;&nbsp;/*删除fifo*/&nbsp;<BR>&nbsp;rtf_destroy(2);&nbsp;<BR>&nbsp;rtf_destroy(3);&nbsp;<BR>&nbsp;rt_task_delete(&amp;tasks[0]);/*删除任务*/&nbsp;<BR>&nbsp;rt_task_delete(&amp;tasks[1]);&nbsp;<BR>}&nbsp;<BR>主程序代码如下:&nbsp;<BR>............&nbsp;<BR>#include&nbsp;&lt;rtl_fifo.h&gt;&nbsp;<BR>#include&nbsp;&lt;rtl_time.h&gt;&nbsp;<BR>#include&nbsp;&quot;control.h&quot;&nbsp;<BR>#define&nbsp;BUFSIZE&nbsp;70&nbsp;<BR>char&nbsp;buf[BUFSIZE];&nbsp;<BR>int&nbsp;main()&nbsp;<BR>{&nbsp;<BR>&nbsp;fd_set&nbsp;rfds;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;timeval&nbsp;tv;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;retval;&nbsp;<BR>&nbsp;int&nbsp;fd0,&nbsp;fd1,&nbsp;ctl;&nbsp;<BR>&nbsp;int&nbsp;n;&nbsp;<BR>&nbsp;int&nbsp;i;&nbsp;<BR>&nbsp;struct&nbsp;my_msg_struct&nbsp;msg;&nbsp;<BR>&nbsp;/*打开第一个fifo数据缓冲*/&nbsp;<BR>&nbsp;if&nbsp;((fd0&nbsp;=&nbsp;open(&quot;/dev/rtf1&quot;,&nbsp;O_RDONLY))&nbsp;&lt;&nbsp;0)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;fprintf(stderr,&nbsp;&quot;Error&nbsp;opening&nbsp;/dev/rtf1\n&quot;);&nbsp;<BR>&nbsp;&nbsp;exit(1);&nbsp;<BR>&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*打开第二个fifo数据缓冲*/&nbsp;<BR>&nbsp;if&nbsp;((fd1&nbsp;=&nbsp;open(&quot;/dev/rtf2&quot;,&nbsp;O_RDONLY))&nbsp;&lt;&nbsp;0)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;fprintf(stderr,&nbsp;&quot;Error&nbsp;opening&nbsp;/dev/rtf2\n&quot;);&nbsp;<BR>&nbsp;&nbsp;exit(1);&nbsp;<BR>&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*打开fifo控制缓冲*/&nbsp;<BR>&nbsp;if&nbsp;((ctl&nbsp;=&nbsp;open(&quot;/dev/rtf3&quot;,&nbsp;O_WRONLY))&nbsp;&lt;&nbsp;0)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;fprintf(stderr,&nbsp;&quot;Error&nbsp;opening&nbsp;/dev/rtf3\n&quot;);&nbsp;<BR>&nbsp;&nbsp;exit(1);&nbsp;<BR>&nbsp;}&nbsp;<BR>&nbsp;/*&nbsp;发送启动实时任务命令&nbsp;*/&nbsp;<BR>&nbsp;msg.command&nbsp;=&nbsp;START_TASK;&nbsp;<BR>&nbsp;msg.task&nbsp;=&nbsp;0;&nbsp;<BR>&nbsp;msg.period&nbsp;=&nbsp;500000;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*向控制fifo写入启动命令*/&nbsp;<BR>&nbsp;if&nbsp;(write(ctl,&nbsp;&amp;msg,&nbsp;sizeof(msg))&nbsp;&lt;&nbsp;0)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;fprintf(stderr,&nbsp;&quot;Can't&nbsp;send&nbsp;a&nbsp;command&nbsp;to&nbsp;RT-task\n&quot;);&nbsp;<BR>&nbsp;&nbsp;exit(1);&nbsp;<BR>&nbsp;}&nbsp;<BR>&nbsp;msg.task&nbsp;=&nbsp;1;&nbsp;<BR>&nbsp;msg.period&nbsp;=&nbsp;200000;&nbsp;<BR>&nbsp;if&nbsp;(write(ctl,&nbsp;&amp;msg,&nbsp;sizeof(msg))&nbsp;&lt;&nbsp;0)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;fprintf(stderr,&nbsp;&quot;Can't&nbsp;send&nbsp;a&nbsp;command&nbsp;to&nbsp;RT-task\n&quot;);&nbsp;<BR>&nbsp;&nbsp;exit(1);&nbsp;<BR>&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*读取数据fifo中的数据并打印*/&nbsp;<BR>&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;100;&nbsp;i++)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;FD_ZERO(&amp;rfds);&nbsp;<BR>&nbsp;&nbsp;FD_SET(fd0,&nbsp;&amp;rfds);&nbsp;<BR>&nbsp;&nbsp;FD_SET(fd1,&nbsp;&amp;rfds);&nbsp;<BR>&nbsp;&nbsp;tv.tv_sec&nbsp;=&nbsp;1;&nbsp;<BR>&nbsp;&nbsp;tv.tv_usec&nbsp;=&nbsp;0;&nbsp;<BR>&nbsp;&nbsp;retval&nbsp;=&nbsp;select(FD_SETSIZE,&nbsp;&amp;rfds,&nbsp;NULL,&nbsp;NULL,&nbsp;&amp;tv);&nbsp;<BR>&nbsp;&nbsp;if&nbsp;(retval&nbsp;&gt;&nbsp;0)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;if&nbsp;(FD_ISSET(fd0,&nbsp;&amp;rfds))&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;=&nbsp;read(fd0,&nbsp;buf,&nbsp;BUFSIZE&nbsp;-&nbsp;1);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;buf[n]&nbsp;=&nbsp;0;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;FIFO&nbsp;1:&nbsp;%s\n&quot;,&nbsp;buf);&nbsp;<BR>&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;if&nbsp;(FD_ISSET(fd1,&nbsp;&amp;rfds))&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;=&nbsp;read(fd1,&nbsp;buf,&nbsp;BUFSIZE&nbsp;-&nbsp;1);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;buf[n]&nbsp;=&nbsp;0;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;FIFO&nbsp;2:&nbsp;%s\n&quot;,&nbsp;buf);&nbsp;<BR>&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;}&nbsp;<BR>&nbsp;}&nbsp;<BR>&nbsp;fprintf(stderr,&nbsp;&quot;frank_app:&nbsp;now&nbsp;sending&nbsp;commands&nbsp;to&nbsp;stop&nbsp;RT-tasks\n&quot;);&nbsp;<BR>&nbsp;/*&nbsp;停止实时任务&nbsp;*/&nbsp;<BR>&nbsp;msg.command&nbsp;=&nbsp;STOP_TASK;&nbsp;<BR>&nbsp;msg.task&nbsp;=&nbsp;0;&nbsp;<BR>&nbsp;if&nbsp;(write(ctl,&nbsp;&amp;msg,&nbsp;sizeof(msg))&nbsp;&lt;&nbsp;0)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;fprintf(stderr,&nbsp;&quot;Can't&nbsp;send&nbsp;a&nbsp;command&nbsp;to&nbsp;RT-task\n&quot;);&nbsp;<BR>&nbsp;&nbsp;exit(1);&nbsp;<BR>&nbsp;}&nbsp;<BR>&nbsp;msg.task&nbsp;=&nbsp;1;&nbsp;<BR>&nbsp;if&nbsp;(write(ctl,&nbsp;&amp;msg,&nbsp;sizeof(msg))&nbsp;&lt;&nbsp;0)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;fprintf(stderr,&nbsp;&quot;Can't&nbsp;send&nbsp;a&nbsp;command&nbsp;to&nbsp;RT-task\n&quot;);&nbsp;<BR>&nbsp;&nbsp;exit(1);&nbsp;<BR>&nbsp;}&nbsp;<BR>&nbsp;return&nbsp;0;&nbsp;<BR>}&nbsp;<BR>&nbsp;<BR>--&nbsp;<BR>※&nbsp;修改:·linuxrat&nbsp;於&nbsp;Jan&nbsp;14&nbsp;12:12:46&nbsp;修改本文·[FROM:&nbsp;202.112.168.253]&nbsp;<BR>※&nbsp;来源:·BBS&nbsp;水木清华站&nbsp;smth.org·[FROM:&nbsp;39_38.xjtu.edu.]&nbsp;<BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -