



下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、在 Linux 上模拟 uCOS-II 实时操作系统的实现摘要: uCOS-II 是一个短小而功能强大的实时嵌入式操作系统。在Jean J.Labrosse 先生所著 .由邵贝贝教授翻译的 Micro/uCOS-II THE REAL-TIME KERNEL (Second Edition )一书中对这一操作系统作出了精彩的讲 解,该书是一部关于 uCOS-II 操作系统的经典教材,同时在书中提供了关于 uCOS-II 在 windows 环境下的 移植的 4个范例。本文对其第一个范例作一个在 redhat linux9.0 上的移植版本。 移植的工作主要集中在三个 方面,下文将分为三章,结合
2、代码详细介绍。文章的最后将介绍我的试验平台并演示我的试验结果。1 引言uCOS-II 是一个短小而功能强大的实时嵌入式操作系统。在Jean J.Labrosse 先生所著 .由邵贝贝教授翻译的MicuCOS-ll THE REAL-TIME KERNEL( Second Edition )一书中对这一操作系统作出了精彩的讲解,该书是一部关于 uCOS-II 操作系统的经典教材,同时在书中提供了关于 uCOS-II 在 windows 环境下的移植 的 4 个范例。本文对其第一个范例作一个在 redhat linux9.0 上的移植版本。移植的工作主要集中在三个方面, 下文将分为三章,结合代码详
3、细介绍。文章的最后将介绍我的试验平台并演示我的试验结果。2 字符串的显示字符串显示函数PC-DispStr在文件pc.c中,这个文件本身不是 uCOS-ll的一部分。它的主要工作是建 立一系列的功能函数来发挥 PC机的强大功能,并被测试代码所调用。2.1 设置前景色和后景色我们使用类似于 prinf( "3330m" )的语句来设置颜色 .转义序列就是一个让 shell 执行一个特殊步骤的 控制指令。转义序列通常都是以ESC开头(这也是它的命名原因)。在shell里表示为八。这种表示法需要一点时间去适应,也可以用33完成相同的工怍(ESC的ASCII码用十进制表示就是 27
4、, =用八进制表示的 33)。 33声明了转义序列的开始,然后是 开始定义颜色。下面我们要 选择前景色(这里是 32,代表绿色) 。背景色的 40 表示黑色。要是不想让提示符后面的文字也变成绿色, 我们用 330m 关闭转义序列, 330m 是 shell 的默认颜色。 前景色和背景色都有 8 种可用的选择。 可选颜色: 红色、绿色、黄色、蓝色、洋红、青色和白色。他们对应的颜色代码是: 30(黑色)、31(红色)、32(绿 色)、33(黄色)、34(蓝色)、35(洋红)、36(青色)、37(白色)。用同样色方法设置背景色,不过要把 第一个数字 "3"替换成"4&q
5、uot;,例如 40、41、42、43、44、45、46、47。虽然在这里可以按照上面介绍的对应 关系定义修改在 pc.h 中定义的前景色和后景色的宏,使对应关系更加明确。 (注意:他的后面一位表示前 景色, 前面一位表示后景色) ,但是我们在这里的设计思路是尽量不对原书中的代码作改动,所以在函数的实现中直接使用switch语句,对相应的前景色和后景色。(linux的shell只支持以上几种颜色)switch ( color&0xF0 )/查看前景色 / case DISP_FGND_BLACK: printf ("3330m" ) ;break;switch (
6、color&0x0F )/查看后景色 / case DlSP_BGND_BLACK: prinf ( "3340m" )break;2.2 跟踪光标的位置我使用 printf ( "33%u;%uH",y+1,x+1 )来跟踪光标的位置。 33 是声明了转义序列的开始,上文已经介 绍,不再累叙,y;xH是设置光标位置的格式。x和y分别表示横轴和纵轴。3 键盘输入键盘输入函数 PC_GetKey 在 windows 环境下,由于有库函数 kbhit 返回最近所敲的按键 .就很容易实现。 而在linux环境下我们需要构造自己的kbhit,在参考文献2
7、中John.Wiley.Sons先生提供了一种现成的实现方法(这个方法会阻塞 read 函数 .在本文中并不适用) ,这里我们使用了另外的一种实现方法,下面介绍给 出其实现代码 .int kbhit (void) struct timeval tv;fd_set readFd;struct termios newKbdMode;if (!inited )newKbdMode.c_lflag&=(ICANON | ECHO );newKbdMode.c_ccVTIME=0; newKbdMode.c_ccVMIN=1;tcsetattr( 0,TCSANOW,&newKbdMod
8、e ) ;atexit( rekbd) ;inited=1;tv.tv_sec=0;tv.tv_usec=0;FD_ZERO ( &readFd ) ;FD_SET( STDIN_FILENO,&readFd ) ;select( 1,&readFd,NULL,NULL,&tv ) ;if(FD-ISSET(STDIN-FILENO , &readFd)return 1;elsereturn 0;3.1 控制台的初始化首先,这里使用了全局变量inited,它是一个初始化与否的标记.因为函数kbhit将被多次调用,而初始化只需要做一次 .这样.当发现 in
9、ited 置 1以后,就不会去做重复性的初始化工作了。如果 inited 为 0,就需 要对控制台(键盘)做初始化工作,这里定义了内核结构体termios类型的变量newKbdMode,我们需要对这个结构体的两个成员 c_lflag 和 c_cc 进行初始化,代码中对 c_lflag 的设置表示终端为不回显的非标准模式。 c_ccVTIME=0 ,c_ccVMIN=1 表示读函数会等待 .直到出现 1个键盘输入为止。 (关于这个结构体的 详细分析,可参阅参考文献 2的第5章)。然后再调用tcsetattr把设置的值写入。最后,函数atexit将在3.3节详叙。3.2 检测键盘的输入在这里我们使
10、用宏 FD_ZERO 把内核的结构体 readFd 清 0.用宏 FD_SET 把标准输入的文件描述符 STDIN_FILENO和readFd关联,然后用select函数来监测输入 他只关注一个描述符, 所以第一个参数为1, 第二个参数为上面的readFd,后面的两个参数表示是否关注标准输出和出错的文件描述符,我们不要,所以置 0.最后一个参数表示超时时间,我们不需要, 所以置 0。经过以上的处理后, 如果有输入时 .宏 FD_ISSET就会返回非 0 值。我们就知道键盘上有输入。3.3 系统退出在windows环境下使用了成对的函数PC_DOSSaveReturn ()和PC_DOSRetu
11、rn。前一个保存 DOS的状态,后一个在退出时前调用.恢复保存的DOS状态。而在linux下,表面看来我仅使用函数exit ()直接退出,而没有进行类似的保存一恢复处理.但实际上在linux下我们调用了函数 atexit(function )来设置程序正常结束前调用的函数,当程序通过调用exit ()返回时,参数function所指定的函数会先被调用.然后才真正由exit ()结束程序。function将指定函数rekbd (函数的实现见下面的代码),这个函数就是清屏和清 处所有前文的属性设置,33声明了转义序列的开始,然后是 2J,表示清屏。0m表示关闭所有属性。void rekbd (vo
12、id) prinf ("330m" ) ;prinf ("332J" );4 MAKEFILE 文件的编写在Jean J.Labrosse先生的原书中是使用 boland c的编译器.而我们在linux下使用GCC的编译器,由于 编译器的改变 .所以 makefile 就需要重写。为了简化 makefile 的编写,我提供一种最简单的方法,那就是把 所 有 uCOS-II 的 源 码 ( SOFTWAREuCOS-IISOURCE ). 以 及 配 置 头 文 件 和 测 试 函 数(SOFTWAREuCOS-IIEX1_x86LBC45SOURCE )
13、.还有按上文编写的 pc.c和pc.h文件,全部放在linux的根 目录下.假设为/test78,则makefile可简写为如下方式:UCOS_SRC=/test78UCOS_PORT=/test78UCOS_PC=/test78all:gcc-I$( UCOS_SRC)-I$( UCOS_PORT)-I$ (UCOS_PC) test.c $( UCOS_SRC) /uCOS_II.C$( UCOS_PC) /pc.c $( UCOS_PORT) /os_cpu_c.c -o testall 是一个伪目标, "伪目标 " 并不是一个文件,只是一个标签,它的特性是,总是被执
14、行的。这样的目的是让编译器每次都产生新的目标。-o test指定输出文件为test. -I 选项指定搜索的目录.注意:把所有源文件都放在一个目录下也许并不是一个好方法,它使得整个工程杂乱无章,特别是在 工程比较大时 .是不能这样处理的。但这里仅仅是为了简化 makefile 的编写,提供一个可行的方法。所以在 这个 makefile 的前面, 我定义了几个宏, 如果需要编译的几个文件在路径下, 就只需要指定路径就可以了。5结束语本文的创新点主要体现在1. 自建的键盘输入函数。由于(Beginning.Linux.Programming )中实现会阻塞read函数,所以本文采用了改进的方法实现键
15、盘输入,详见第3节。2. MAKEFILE文件。由于编译器的改变,我们需要改写makefile文件,本文提供了一种非常简单的编写方法,详见第4节。我的试验平台如下:在 Virtual PC 2004上安装red hat linux 9.0,并且在linux下进行编译和调试。参考文献:1 Jean J.Labrosse (邵贝贝译)嵌入式实时操作系统UC/OS-II (第2版)2 John.Wiley.Sons.Beginning.linux.Programming ,Third.Edition3 Werner Zimmermann uCOS-II-Port for the 口NUX Operating System4 石绍应,张圮,罗诗途.基于嵌入式操作系统 VxWorks的战车虚拟仪表显示技术研究J.微计算机信 息,2005
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 阿克苏职业技术学院《表演剧目排练(一)》2023-2024学年第二学期期末试卷
- 陇南地区宕昌县2024-2025学年小升初易错点数学检测卷含解析
- 陕西国防工业职业技术学院《耳鼻喉科学》2023-2024学年第二学期期末试卷
- 陕西学前师范学院《营养制品工艺学》2023-2024学年第二学期期末试卷
- SCI论文写作与投稿 第2版-课件 8-SCI论文参考文献引用
- 陕西理工大学《自弹自唱与伴奏》2023-2024学年第二学期期末试卷
- 陕西省商洛市第3中学2025年高中毕业生第一次统一复习检测试题生物试题含解析
- 高校党风廉政建设责任制考评机制研究汇报0321new
- 陕西省汉中市2025届高三下期中教学情况调研历史试题含解析
- 陕西省渭南三贤中学2024-2025学年高三第三次模拟生物试题试卷含解析
- 基础会计学课件 第九章 财产清查
- 采购活动中的道德规范试题及答案
- 2025年高考统编版历史二轮复习讲座《分省命题时代的备考、教学与命题 》
- 2025年二级建造师矿业工程真题卷(附解析)
- 2025-2030中国叔丁基硫醇(TBM)市场现状调查及发展战略研究研究报告
- 火灾调查报告范文
- 2025年上半年福建莆田市市直事业单位定向招考未就业随军家属6人重点基础提升(共500题)附带答案详解
- 【初中语文】第16课《有为有不为》教学课件2024-2025学年统编版语文七年级下册
- (一模)青岛市2025年高三年级第一次适应性检测地理试卷(含标准答案)
- 2025年铁岭卫生职业学院单招职业技能测试题库学生专用
- 广告投放预算分配情况统计表(按预算项目)
评论
0/150
提交评论