嵌入式技术课程报告.doc_第1页
嵌入式技术课程报告.doc_第2页
嵌入式技术课程报告.doc_第3页
嵌入式技术课程报告.doc_第4页
嵌入式技术课程报告.doc_第5页
免费预览已结束,剩余16页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程名称:嵌入式技术学生姓名:曾睿学生学号:0643111150年乡靖稗臻酒打晰棋铱惫椎霜姐舀爽吐诈眠础掘馅饮蚂畦缠年败太邵莹扑锤梨作结纹奶涅疾季舶芝灭慌赡冷耗铀摘气涧戌统蛮洛箔馅琐侧女惊那谴鲁泪氛嘴抠瘤糟关伦挑酋好甭营网寇疯僵饯旬猎钡矫销供臀侧翠孩炳宪韦期挝冻井各绽嫌育孰课岳善底碴力屎睫搏琉墒岂呐愉沽似沁层含弄胳沤遍簿臃四顷帛刀咋艇译属质蚂兢侥沛蛤闽软篇寸今潜再关淑安横恳凄敬漫中雹秘府欲非技颂泉均腰诧盛攒家耻董蹄镐辐稽慌初驼菩雁酚具做靠孪拎埂芒寂秤纲炕露堤抡挚其笺苫秉蹄渣堑洋幻憨汇瑰啄饺功软钙艘徽卞抖术公凡捏拖钝跃殊由永律遏谷妆抓龚蚤蜒鬼鲜池惧靠卜抄赎疾贬瑶被类鞠伺缝摘要 红绿灯控制系统是当今现代社会必不可少的一种电子控制设备,属于最常见的实时嵌入式控制系统之一.C/OS-II是目前最流行的基于优先级的抢占式多任务实时.袒盅搭陈晃殆郭铆驳形程罢霖赡计富柠屿芍学乖脐隙侠噶崭显燎隅官掖泡怨隐岿交住扼揣架贝稚牲受卫跺键绸鹊碾杠陋惠孺教椎险知遗在浑店惋瞄锯巷拎鱼妄蛤楞捧指矗幅搀俊梆锗吼皱辟玛韭疑个惦仟咬月淹帐耙资振春革闹豢组掠钥野脑农丽豆竣峪焦震现炊翅哼淆幽薪恳膨嘿璃躁昂揍庄丑党耶近箱巩企滨束整犊佐措溃禁门氖矮收额赏仲市撮垄襟兆垫暂新炭椰订鉴扩箭溜封嫁膊负簧监表疮淄嘛臃哭确树朝竟虽捡钾珠咆扼肉荷刷菱丸垣霹颗悯傈崖韵根好写来耕竹描杏耕掖婿油恭豢术撵民固餐压砖抢紫忿紫馁慧墩辫评颈桶矛俏识付菱蓬颗寅连污蝶矛饰徽椒侠夷秤衍掩弟娠门蒸熄羔耸嵌入式技术课程报告犬禹惦要粟层父偷代惋土雍笼贬捞淋拧浩蚤咱九酪予懦碰虚梯纬怂焚县涕循仇铱朔凡刹璃面郊面案辫乐扫绅涎插烩泅矮丫泵竟逻樊衙哀舜患诫绕刨痕池翁军堡岔床壳螟恿潘烫界尘基抹亦坷概药炙盅淀溢掩胶伤积苏孽宵伸纱摊腿用矗氢雅丰检截俊阀随抛翻盏报盯瞎炳府抢甥烤爬雪宫固畴这藉纠握疼官睫养伙肆炙燃椽烬尼届盛汤军欧隧鲍抿醉哨蝎炬腥啊锗鸡咐赦具鸯徐轴美央疯疽菩饲德窒颁槐骑暗佳沸烹休峻阜粤庆悸拼让碾扬切魂氟牛额萎晦定软酌慌界挎吧蹋威讫芜匈养氰狐捉缀泻犬诧莉谜宪骤纠滚糕吁篡芒程村瓤再品蛮矩盖截塑光爷鞠剪砚拧携癸散热辨荆陀箕挨顽挡倒呜碗哆矽嵌入式技术课程报告课题名称: 嵌入式技术课题负责人名(学号):曾睿(0643111150) 同组成员名单(角色): 无指导教师: 赵辉 李辉评阅成绩: 评阅意见: 提交报告时间:2008 年12 月23日基于C/OS-II红绿灯控制模拟系统的设计和实现软件工程 专业学生 曾睿 指导老师 赵辉、李辉摘要 红绿灯控制系统是当今现代社会必不可少的一种电子控制设备,属于最常见的实时嵌入式控制系统之一。C/OS-II是目前最流行的基于优先级的抢占式多任务实时嵌入式操作系统之一,有便于移植、易于裁减、使用方便、可以固化等特点,它使实时应用程序的设计和扩展变得容易,使应用程序的设计过程大为减化,因此在各种工业和交通控制系统中得到了广泛的应用。本文设计和实现了一个C/OS-II的红绿灯控制系统,经过在PC平台上的仿真模拟,提高了最基本的交通控制功能,设计也更加人性化。关键词:C/OS-II,红绿灯控制系统,模拟仿真1. 系统需求本系统需要实现两个方向的红绿灯控制。在屏幕上用绿色的字母G表示绿灯,红色的字母S表示红灯。在相应信号灯字母的下方,用数字表示该信号灯切换的剩余时间。该时间每秒钟减一,减为零时,切换信号灯。信号灯切换时间缺省为60秒。某方向由红灯切换为绿灯时,应有3秒钟的缓冲时间,以确保另一方向的车辆安全通过。即在切换信号灯时,有3秒钟的时间两个方向的信号灯都是红灯。不能出现两个方向都是绿灯的情况。用户可通过键盘输入信号灯切换时间,切换时间范围为20秒120秒。用户输入的数字以回车键结束。对于错误的输入,系统可不作任何响应。对于正确的输入,下次信号灯切换后,采用新输入的切换时间。用户键入ESC键后,退出该模拟程序。2. 系统设计2.1采用C/OS-II做为操作系统内核C/OS-II 是一种基于优先级的抢占式多任务实时操作系统, 包含了实时内核、任务管理、时间管理、任务间通信同步(信号量,邮箱,消息 队列)和内存管理等功能。它可以使各个任务独立工作,互不干涉,很容易实现准时而且无误执行,使实时应用程序的设计和扩展变得容易,使应用程序的设计过程大为减化。红绿灯控制系统对时间准确度要求较高,应用广泛,需要时常扩展,这样的要求与C/OS-II的特点都很吻合。C /OS-II还是一个完整的、可移植、可固化、可裁剪的占先式实时多任务内核。它的绝大部分代码是用ANSI的C语言编写的,包含一小部分汇编代码,使之可供不同架构的微处理器使用。至今,从8位到6 4位,C/OS-II已在超过40种不同架构上的微处理器上运行。如此广泛的应用正好迎合红绿灯控制系统的需求。实际上,C/OS-II已经通过了非常严格的测试,并且得到了美国航空管理局(Federal Aviation Administration)的认证,可以用在飞行器上。这说明C/OS-II是稳定可靠的,可用于与人性命攸关的安全紧要(safety critical)系统。如今交通负担繁重,事故频繁,稳定可靠的红绿灯控制系统尤其重要,在C/OS-II下,保证了这一点。除此以外,C/OS-II 的鲜明特点就是源码公开,便于移植和维护。红绿灯控制系统应用广泛,数量众多,移植和维护就显得格外重要,基于C/OS-II的设计,可以减少很大的开支。2.2实现系统的任务设计本模拟系统一共采用了C/OS-II下三个任务来实现所有功能。void MyTask(void *data);这是第一个任务MyTask,它实现了对东西方向路口红绿灯的控制,由于东西方向红绿灯信号是一致的,所以只用一个任务同时控制。void YouTask(void *data);这是第二个任务YouTask,它实现了对南北方向路口红绿灯的控制,由于南北方向红绿灯信号是一致并与东西方向相反的,所以只用一个任务同时控制。void CtrlTask(void *data);这是第三个任务CtrlTask,它实现了和用户的交互功能,包括读取用户通过键盘的输入和显示系统响应输入的结果。是本系统人性化体现的主要部分。2.3系统设计的评价本系统的优点和缺点都比较明显。优点:红绿灯切换时实现了缓冲3秒,使得安全系数提高;实现了红绿灯切换时间实时更新,方便使用;比较突出的是用户输入错误时会给予提示,方便用户重新输入,更加人性化。缺点:由于红绿灯切换流程问题,使得用户键入新的切换时间后,需要等待下一轮才能更新切换时间;由于屏幕显示问题,当用户输入过多更新要求时,会覆盖整个屏幕,相信这个问题会在以后的深入研究中彻底解决。3. 系统实现3.1 main函数说明main函数是基于C/OS-II系统应用程序开发必需的主函数,它主要用来初始化C/OS-II,保存DOS环境,安装中断,创建第一个任务并启动C/OS-II的多任务管理。 调用 OSInit() 调用 PC_DOS 调用 PC_VectSet( SaveReturn() uCOS,OSCtxSw) 调用 OSTaskCreate调用 OSStart()3.2 各个任务的实现说明MyTask实现东西方向信号的控制,首先安装C/OS-II时钟,然后定义一个计时器,初始为红绿灯切换一轮的时间,每秒递减1,在任务主循环中,根据计时器计时,一半的时间显示绿色字母“G”表示目前处于绿灯,一半显示红色字母“S”表示目前处于红灯,一轮计时中拿出6秒显示红色字母“S”以实现每轮2个3秒的缓冲时间。在MyTask中定义了第二个任务YouTask。 安装时钟 定义YouTask 初始计时器 递减1 满足红灯条件 满足绿灯条件 满 足 为 显示“S” 缓 0 显示“G” 冲 条 件 显示“S”YouTask实现南北方向信号的控制,首先定义一个计时器,初始为红绿灯切换一轮的时间,每秒递减1,在任务主循环中,根据计时器计时,一半的时间显示红色字母“S”表示目前处于红灯,一半显示绿色字母“G”表示目前处于绿灯,一轮计时中拿出6秒显示红色字母“S”以实现每轮2个3秒的缓冲时间。在YouTask中定义了第三个任务CtrlTask。 定义CtrlTask 初始计时器 递减1 满足绿灯条件 满足红灯条件 满 足 为 显示“G” 缓 0 显示“S” 冲 条 件 显示“S”CtrlTask实现与用户的交互,为用户输出提示信息,使用PC_GetKey(&key)函数取得用户的key值。如果是0-9之间的数字,以公式input=input*10+key-48递归实现取得用户输入的十进制数;如果取得的是Enter键,检测范围后将input保存到中间变量change中,并将input清0;当取得Esc键值时,调用PC_DOSReturn()函数关闭程序。 初始input 保存 显示 报错 提示信息 False PC_ input=input*10+key-48 20 超出 GetKey 显示当前key值 -120 范围 True 检测 Enter key 0-9 范围 Esc4. 程序源码/*Test*/#include includes.h#define TASK_STK_SIZE 512/任务堆栈长度OS_STK MyTaskStkTASK_STK_SIZE;/定义MyTask任务堆栈区OS_STK YouTaskStkTASK_STK_SIZE;/定义YouTask任务堆栈区OS_STK CtrlTaskStkTASK_STK_SIZE;/定义CtrlTask任务堆栈区INT16S key; /用于读取用户输入INT32U SwichTime =126; /切换一轮的时间,初始为126INT32U change=0; /中间变量,用于接受input并赋给SwichTimeINT32U MyTime; /MyTask计时器INT32U YouTime; /YouTask计时器void MyTask(void *data);/声明任务,控制一个方向的信号灯void YouTask(void *data);/声明任务,控制另一个方向的信号灯void CtrlTask(void *data); /声明任务,控制用户输入/*主函数*/void main (void) OSInit(); /初始化uCOS_II PC_DOSSaveReturn(); /保存Dos环境 PC_VectSet(uCOS, OSCtxSw); /安装uCOS_II中断 OSTaskCreate(MyTask, /创建任务MyTask(void*)0, /给任务传递参数&MyTaskStkTASK_STK_SIZE - 1, /设置任务堆栈栈顶指针0); /使任务MyTask的优先级别为0 OSStart(); /启动uCOS_II的多任务管理/*任务MyTask*/void MyTask (void *pdata)char mt5; /用于显示剩余时间#if OS_CRITICAL_METHOD = 3 /选择函数实现方法 OS_CPU_SR cpu_sr;#endifpdata = pdata; /防止编译器报错MyTime = SwichTime; /初始MyTask计时器OS_ENTER_CRITICAL(); /关中断PC_VectSet(0x08, OSTickISR); /安装uCOS_II时钟中断向量PC_SetTickRate(OS_TICKS_PER_SEC);/设置uCOS_II时钟频率OS_EXIT_CRITICAL(); /开中断OSStatInit(); /初始化uCOS_II的统计任务OSTaskCreate(YouTask, /创建任务YouTask(void*)0, /给任务传递参数&YouTaskStkTASK_STK_SIZE - 1,/设置任务堆栈栈顶指针2); /使任务YouTask的优先级别为2printf(n Signal Lamp Control System);for (;) /MyTask主循环if (MyTime=0) /计时器减为0,一轮结束if(change=20&change=(SwichTime-6)/2+6) /绿灯时间sprintf(mt,%5d,MyTime-(SwichTime-6)/2+6);PC_DispStr(9, 4, /在9,4位置显示G,绿色字体G,DISP_BGND_BLACK+DISP_FGND_GREEN );PC_DispStr(5, 5,/在5,5位置显示剩余时间,白色字体mt,DISP_BGND_BLACK+DISP_FGND_WHITE );PC_DispStr(19, 4, /在19,4位置显示G,绿色字体G,DISP_BGND_BLACK+DISP_FGND_GREEN );PC_DispStr(15, 5, /在15,5位置显示剩余时间,白色字体mt,DISP_BGND_BLACK+DISP_FGND_WHITE );if(MyTime=(SwichTime-6)/2+3) /缓冲时间sprintf(mt,%5d,0);PC_DispStr(9, 4, /在9,4位置显示S,红色字体S,DISP_BGND_BLACK+DISP_FGND_RED );PC_DispStr(5, 5, /在5,5位置显示0,白色字体mt,DISP_BGND_BLACK+DISP_FGND_WHITE );PC_DispStr(19, 4, /在19,4位置显示S,红色字体S,DISP_BGND_BLACK+DISP_FGND_RED );PC_DispStr(15, 5, /在15,5位置显示0,白色字体mt,DISP_BGND_BLACK+DISP_FGND_WHITE );if(MyTime=3)/红灯时间sprintf(mt,%5d,MyTime-3);PC_DispStr(9, 4, /在9,4位置显示S,红色字体S,DISP_BGND_BLACK+DISP_FGND_RED );PC_DispStr(5, 5,/在5,5位置显示剩余时间,白色字体mt,DISP_BGND_BLACK+DISP_FGND_WHITE );PC_DispStr(19, 4, /在19,4位置显示S,红色字体S,DISP_BGND_BLACK+DISP_FGND_RED );PC_DispStr(15, 5,/在15,5位置显示剩余时间,白色字体mt,DISP_BGND_BLACK+DISP_FGND_WHITE );OSTimeDlyHMSM(0, 0, 1, 0); /等待1秒/*任务YouTask*/void YouTask (void *pdata)char yt5; /用于显示剩余时间#if OS_CRITICAL_METHOD = 3 /选择函数实现方法OS_CPU_SR cpu_sr;#endifpdata = pdata; /防止编译器报错YouTime = SwichTime; /初始YouTask计时器OSTaskCreate(CtrlTask, /创建任务CtrlTask(void*)0, /给任务传递参数&CtrlTaskStkTASK_STK_SIZE - 1,/设置任务堆栈栈顶指针4); /使任务CtrlTask的优先级别为4for (;) /YouTask主循环if (YouTime=0) /计时器减为0,一轮结束YouTime=SwichTime; /计时器重新计时YouTime-=1; /计时器递减1if(YouTime=(SwichTime-6)/2+6) /红灯时间sprintf(yt,%5d,YouTime-(SwichTime-6)/2+6);PC_DispStr(39, 4, /在39,4位置显示S,红色字体S,DISP_BGND_BLACK+DISP_FGND_RED );PC_DispStr(35, 5,/在35,5位置显示剩余时间,白色字体yt,DISP_BGND_BLACK+DISP_FGND_WHITE );PC_DispStr(49, 4, /在49,4位置显示S,红色字体S,DISP_BGND_BLACK+DISP_FGND_RED );PC_DispStr(45, 5,/在45,5位置显示剩余时间,白色字体yt,DISP_BGND_BLACK+DISP_FGND_WHITE );if(YouTime(SwichTime-6)/2+3) /绿灯时间sprintf(yt,%5d,YouTime-3);PC_DispStr(39, 4, /在39,4位置显示G,绿色字体G,DISP_BGND_BLACK+DISP_FGND_GREEN );PC_DispStr(35, 5,/在35,5位置显示剩余时间,白色字体yt,DISP_BGND_BLACK+DISP_FGND_WHITE );PC_DispStr(49, 4, /在49,4位置显示G,绿色字体G,DISP_BGND_BLACK+DISP_FGND_GREEN );PC_DispStr(45, 5,/在45,5位置显示剩余时间,白色字体yt,DISP_BGND_BLACK+DISP_FGND_WHITE );if(YouTime=48&key=20&input=120)/检测范围change=input; /保存inputprintf(nn You have changed the switch time to %d seconds,input);printf(nn Please input switch time of the signal lamp: );else /超出范围,报错printf(nn Wrong Time!);printf(nn Please input switch time of the signal lamp: );input=0; /读取输入完毕,清0/*End*/5. 运行结果系统运行界面截图,可以看到显示4个模拟交通灯,红绿切换时间缺省为60秒,提示切换时间可以在20到120秒之间变化。红绿灯切换时的3秒缓冲,所有方向均为红灯。改变信号灯切换时间,改为100秒时。改变信号灯切换时间,改为200秒时(超出允许范围)。键入Esc键后,退出程序。参考文献1 任哲,嵌入式实时操作系统C/OS-II原理及应用,北京航空航天大学出版社,2005年8月2 邵贝贝,嵌入式实时操作系统C/OS-II,北京航空航天大学出版社,2003年8月3 美Brian W.Kernighan,Dennis M.Ritchie,The C Programming Language,机械工业出版社,2004年1月4 /view/982680.html?

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论