嵌入式操作系统试验报告材料11470_第1页
嵌入式操作系统试验报告材料11470_第2页
嵌入式操作系统试验报告材料11470_第3页
嵌入式操作系统试验报告材料11470_第4页
嵌入式操作系统试验报告材料11470_第5页
已阅读5页,还剩21页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

1、实用文档实验一嵌入式开发环境的建立一、实验目的通过此实验系统,读者可以了解嵌入式实时操作系统uC/OS-ll的内核机制和运行原理.本实验系统展示了 uC/OS-ll各方面的治理功能,包括信号量、队列、内存、时钟等.在各个 实验中具体介绍了 uC/OS-ll的相关函数.读者在做实验的同时能够结合理论知识加以分 析,了解各个函数的作用和嵌入式应用程序的设计方法,最终对整个uC/OS-ll和嵌入式操作系统的应用有较为清楚的熟悉.二、实验步骤1. 安装集成开发环境 LambdaEDU集成开发环境LambdaEDU的安装文件夹为 LambdaEDU,其中有一个名为"Setup.exe 的文件,

2、直接双击该文件便可启动安装过程.具体的安装指导请看“LambdaEDU安装手册.doc 文件.当LambdaEDU安装完毕之后,我们看到的是一个空的界面,现在就开始一步一步地将 我们的实验工程建立并运行起来.2. 建立工程为了我们的实验运行起来,需要建立1个工程基于x86虚拟机的标准应用工程.通过点击“文件、“新建、“工程开始根据向导创立一个工程.在随后出现的对话框中选择"Tool/标准应用工程,点击下一步,开始创立一个标准的 可执行的应用程序工程.在随后出现的对话框中填入工程名称"ucos_x86_demo.点击"下一步.标准选择“ pc386 uC/OS-ll

3、应用x86 作为该工程的应用框架.点击“下一步选择"pc386_elf_tra_debug 作为该工程的根本配置.点击“完成.<±.ts- | 下-步辺拧 I 兄成 I取梢新创立的工程"ucos_x86_demo将会被添加到工程列表.src文件夹下保存了该工程中包含的源文件.ucos2文件夹中包含了移植到 x86虚拟机的全部代码.init.c文件是基于ucos2和本虚拟机的一个应用程序.在进行ucos2内核实验中,只需要替换init.c 文件,即可.文件名不限,但是文件名中最好不要使用英文符号和数字以外的其他字符,:詁iai kiSfriu 时心箪 M 即

4、用冃吩 工A冒 氓打 国口晳 削枷制|ifc- C - © 0 工J 曰nF51忖1関*3. 构建工程到这里,工程配置全部完成.接下来就可以进行构建工程了.第一次构建本工程,在此工程上点击右键,选择“重建BSP及工程.即可开始构建.之后弹出的对话框显示了构建的进度.可以点击“在后台运行,以隐藏该对话框在构建的同时,在右下角的“构建信息视图输出构建过程中的详细信息:Ju町-" I阮可爭肓©. 1宀卩药屮G+职罚送7 押=* PYMdlfi *令备否 L; 汗用田djlr e-曰LU時 iu!«*£'!t 匚口匚 X*-|ZFil7JtT*

5、&/tJfCh/HK/bUl/40Qlf*-U -T li>TU*<Ji46_0h4K | 4ftB- QL/ffrc/nD*52A3S_U_jli & n /bjaZUD&aa/Qi_GMLC o ./9FE/Tui»isOS_FUjt. d ./dicZuoirL 'ns.'inKiIr obmhawiiMS.HK* i/vkoAirarifMOBUE4霞fi 事-/'xe- uc = e2,i' *jS Z aS&_ d _ / x e Utzx.- 2-_ 11 ME. - 口u/口 uh . / x

6、 E<MuDar J1L d / xrc/axut _ 口口兀lidhiB'Dah rtf*! Mbf出“賈拿田曹事;cr»ffe hii Xibsn?w_irt4HdbHf *C: /LaiiidiffitK/lus't/lf liti-dud buLidObinE: 1iueidB虬.山u>.寸Fum 油0曲 *build.Lr<p ltKhrodxatefiDiliiJir T"rj*t nC: f'LubdLiLLLiU- kat/ i ri«,-DE_xUri_daKfc:x dBa-iir. */'&#

7、39;iura_ da»D. Ifrnvdc ai = C LirJi rti /EJAiidMfil/'lujn/1 ttl/ iifCh/SiiSC/bliv1 d£ac»-l< -t -d "LCzZLubfEil- t Kta*t/iaQLVlJVi|lfl/133¥JAiT It-LT 1*1 AM- d-lEIiiJi1'FfZ-jtI/ 1 >1*: stdpsee/Tsr>>> « = 5._-1 WfZpc!5.« 1Tj e、_*t-J戏'Hb -FT

8、 -1C /Laftliijhd'Dir- |.1 IT/ J Ir/ .Lfc - I- I .*/ij. hf ilir _d?B 邸t汀.応£J *tajt j»L-llr l RdSC i 丿匚 zs'bd 15DC +i> Jp t rp s/csrdr. T0h/p- 立r+ ar/trflc&jasj-'cf Q.归Ci /LailiMDM/tJujjri/t lIVliv 】*/< un. -rt Hrt电li.bue<M lfl_iaM- Tb可-Lcjwrft ! an-Cl: rwupi £:

9、u|-«t/*±co/itext wad-a nCa/LtAhdinlDE1 l>>>ft# i-ii.'*i上叶r /: i>r HE ="|li_ilf.11訂堂“um?5 I乩 allC /Laat'lLEDC-'lw rt/t C'C'L' nt uh/bgrBajV 'iDPEe-d L M- -A -Il4Mbdl|l<IUin/>dl/BVpiijiWl/u&CiPJilH_d«M/p03l«IC.1eu*M|Arita/«

10、;MUlML*Al|tt*> tlf lpTtrlBti tnCi /L 3»bdi£iC- k>3 rtr*t ddL' tde p its*L ;兀事的甘陆 bl <+/! fe&l. Pi-FV TK - r fC: ZLdiIidlaEDIL Ivajrt/ i da/nrhjigi '/ucRr_.xB6_-daBJQipc3B6t_aalE_tx &_3Uueax_ndnm. alf pxnoxa. tadt广 T tKi. I J'l I :u 宀!. : i. . . . ii 4. u k i.r

11、"- I tr.F . J ! ' >!i - ,. i . i= hi I r ":- I "«Cl r'LiibiiilliC La st/t i-dL till .C ZLiyU-l-d-D luTZI sol/ bf-hjaybiirv,-LTi/L >Rb ;EE T/t ii j fr?Zc c »U| it¥_rf-c< H>M5/1bit*zLj.泞L wr1勺时育匚卄r -事上气皿厂 跡 冒H j日I违NC : /_u;'tid.uDLr- ka irt/1 da/vo

12、rtajp .- r-r xH6bIf 1 t a dHburcu 3 infccndir Wap iiap_ *1 jetL: XLubiiBliblL- 1 Bi g«*fe. t 口J fefiZ jr4 he A F" 一如亡 C;4* LF|vfe/4 naiyiili/3 ME弱cKb.i4i, - -rt <*!:_耳賞mfp Ix.bisascr.n EG_ dwpa.戛 *4rp_. - -r-. Il :. : L _L . . - . J 二l -.|. . i _ Ad .亠':i .iMEL.:-亠亠 _ hit L- - ? -xS

13、.-. 1- '.J « J. I J. .'C '匚gpd/ED- ka he# 13e/- thfp 工:呼i兀D£ xBf - W:VpcIE" lf _ue/ux :> e / W 1*牛 elfkd l/ucVillA/bui/wated m -A rL : /LKkhtlihEDIL'hfl artjixla/raE-kj-p if«1i*UE-E!K_x8b产'SEE 1E_+h 曰七bj£- akH./urox_,M:i% daaa. alf t 千 tieb. fcrlFLfiJT

14、lhaKi bU13d.Lr<4 L f . !1C: J_mliL*ED匸* lu rfc/ i da1 parkjji ifByLCEtr.xBh = dBBjl*pE,3E6a lE.'i x x_-uk. *. t/iu-sdaas. aHf=w« h i mi -i-"1 口 _ -_h» j ,_a_Bjj_g_n_j|j_u_Man_M_rI注:“重新构建将本工程中的全部源代码进行一次完全的编译和连接,花费时间较多.“构建工程那么仅仅将新修改正的源代码进行编译和连接,花费时间最少.“重建BSP及项目,不但要完成"重新构建的全部

15、工作,另外还要编译与该工程有关的的LambdaEDU中内置的局部代码,花费时间最多.但是在工程刚建立后,第一次构建时需要选择“重建 BSP及工程.以后的构建中选择“重新构建或“构建工程即可.另外,在替换了源代 码中的文件后,需要选择“重新构建来完成该工程的构建.4.配置虚拟机和目标机代理(1)制作X86启动盘在LambdaEDU中依次点击“工具、“ Bochs 、“制作虚拟机启动映象.血M%1 IMG金配叩AV-if = b & Fi-:viL*3H 占 "I04曲-BitMADUu 鳥r/cw-节r4Ui Hfa-«rfleil.1fJ.1"E-'

16、;S*j£jtbpUh日 * ThgftB»&h4F?F¥tHciiisjxj sfifi J) Ut Qi 丘丹和 TO":帀I:ri-1Si hgmts s:.匚込 |udj1_$7:lS a hr nvQWChr心h>MiJ曲闻»; KC Ao-ir>imidJEDIVEu>itAaol/«:>rti/B4ai'b>:Ln/dJjD>ie«z -i HlKHMjEM_flH»i« /koAiidQSjP(XFi of!4k削9韓询a/naAWMlS

17、>l.C;» i/KOMMiJLABga 4/ih/wvKI.B*c-vre ueelt2-'L'23_EJIL 3 - /if E/uenB£/DS_flIlTEi. a . /r-iiBEa2/4Sli|. d ./xxiiEaB/OS.SElL-'. i. Timr 九 :.-!-/« .!fl: - iP-=: r:. h .; i i- LjabtlWlLUgA.nrt fj_3二ilZ_B£_dki星迪出 12 4jcpi:jr二.|y"bux j_a沁占.口 a.ii - O % EQ h»

18、 "I « p j j 巴.知 ! I |,"1和曲5祁理|iff.a:脚吓?>6|眷曲討对启动盘进行一些参数设置后(如下列图所示),系统将自动为你生成一个PC虚拟机的启动盘映像.(2)配置虚拟机选择使用的网络适配器网卡后,点击“确定完成配置.注意:如果计算机上有多网卡,请将其他网卡停用包括 VMware虚拟机添加的虚拟 网卡.3创立目标机代理配置好虚拟机后,创立目标机代理:点击LambdaEDU左下方窗口中绿色的十字符号,在弹出的窗口中选择“基于 TA的连接方式,并点击“下一步.在弹出的“新目标机连接配置中的这些参数,应该与之前制作启动盘时设置的参数一 致

19、.名字:输入目标机的名字缺省是default ,注意如果和现有目标机重名的话,字.连接类型:默认选择 UDPIP地址:这里输入目标机在本实验系统中是虚拟机的IP地址;最后点击“确定,在目标机治理窗口中,可以看到新增加了一个名为default节点改个名的目标机4调试应用 启动虚拟机.虚拟机启动后的画面如下其中显示的IP地址创立虚拟机启动盘时填入的IP地址中设置的IP地址在成功完成构建的工程 ucos_x86_demo中的"pc386_elf_tra_debug 上点击鼠标右键, 在弹出的菜单中选择“调试,启动调试器调试生成的程序:沁/tFf-t ir Jhi ¥i iuiTi

20、曲亍甘 m 低Efi 丁且帕 运厅加sryi州er m=n1AFBI! 口耶盯葛QpMQ"目誓I 垂聊E3 II 忡叙WB3蓟知 钙砂5曲也I«»(£)4 aI首 H'l|;#t 3)A neMTfl t.THffi H vjfGE1 I1-* R 1:11 13皿:卑:Hf IGW3 dvfttiLuC-* ; UQf ;d«iid.t£-Lf! 4 UQF .比莊对事di4«r»lu-i:a i Utir ,J «*«)If 4)lint t u<ntJ *理J: 6- d P

21、.« jiji c« tlnii n» vojuit &Ai>:h> o * onir :'fhsni: ipta i S wiil Z'rtr rr-j-'LwL- d M-iiLt r-fk : rl. e tIF 朿| . J.*! i |"1和1«-4啊M| MT|* 曲討第一次进行调试/运行,需要选择目标机,如下列图,选择“ Default ,点击“确定,开始向目标机虚拟机下载应用程序.选择冃折机选擇一个用于凋试的目棕机可选的目标机:def aultfdef suit)取消程序下载完成后,会

22、弹出一个“确认透视图切换对话框,选择“是,切换到调试透 视图.应用程序已邂业于皙停找态*是習立即切换到调皿透观團?厂记住我的决定昌调试的界面如下:点击绿色的按钮,全速运行.注意:全速运行后,程序不能够被暂停和停止.三、实验过程中遇到的问题及体会在设置IP地址时,要求该IP地址与本计算机在同一个子网中,同时要求该IP地址没有被网络上其他计算机使用.此外,通过构建开发环境,处次体验到了嵌入式开发工作的乐趣.实验二 任务的根本治理一、实验目的1. 理解任务治理的根本原理,了解任务的各个根本状态及其变迁过程;2. 掌握 uC/OS-II 中任务治理的根本方法(创立、启动、挂起、解挂任务) ;3. 熟练

23、使用 uC/OS-II 任务治理的根本系统调用.二、实验原理及程序结构1. 实验设计 为了展现任务的各种根本状态及其变迁过程,本实验设计了Task0、 Task1 两个任务:任务 Task0 不断地挂起自己,再被任务 Task1 解挂,两个任务不断地切换执行.通过本实 验,读者可以清楚地了解到任务在各个时刻的状态以及状态变迁的原因.2. 运行流程 描述如下:(1) 系统经历一系列的初始化过程后进入boot_card() 函数,在其中调用 ucBsp_init() 进行板级初始化后,调用main() 函数;(2) main()函数调用 OSInit()函数对 uC/OS-ll内核进行初始化,调用

24、 OSTaskCreate仓U 建起始任务 TaskStart;(3) main()函数调用函数 OSStart()启动uC/OS-ll内核的运行,开始多任务的调度,执 行当前优先级最高的就绪任务TaskStart;( 4) TaskStart 完成如下工作:a、 安装时钟中断并初始化时钟,创立2个应用任务;b、 挂起自己(不再被其它任务唤醒),系统切换到当前优先级最高的就绪任务TaskO.之后整 个系统的运行流程如下:t1 时刻, Task0 开始执行,它运行到 t2 时刻挂起自己;t2 时刻,系统调度处于就绪状态的优先级最高任务Task1 执行,它在 t3 时刻唤醒Task0,后者由于优先

25、级较高而抢占CPU ;Task0 执行到 t4 时刻又挂起自己,内核调度 Task1 执行;Task1 运行至 t5 时刻再度唤醒 Task0;3. QOS-U中的任务描述一个任务通常是一个无限的循环 ,由于任务的执行是由操作系统内核调度的, 因此任务是 绝不会返回的,其返回参数必须定义成void.在卩C/OS- n中,当一个运行着的任务使一个比它优先级高的任务进入了就绪态, 当前任务的 CPU 使用权就会被抢占, 高优先级任务会 马上得到 cpu的限制权(在系统允许调度和任务切换的前提下).卩c/os- n可以治理多达64个任务,但目前版本的卩C/OS- n有两个任务已经被系统占用了(即空闲

26、任务和统计任务).必须给每个任务赋以不同的优先级,任务的优先级号就是任务编号(lD) ,优先级可以从0到OS_LOWEST_PR10-2.优先级号越低,任务的优先级越高.卩C/OS- n总是运行进入就绪态的优先级最高的任务.4. 源程序说明(1) TaskStart 任务TaskStart 任务负责安装操作系统的时钟中断效劳例程、初始化操作系统时钟,并创立所 有的应用任务:UCOS_CPU_lNlT(); /* lnstall uC/OS-ll's clock tick lSR */ UCOS_TlMER_START(); /*Timer 初始化 */TaskStartCreateTa

27、sks(); /* Create all the application tasks */ OSTaskSuspend(OS_PRIO_SELF);具体负责应用任务创立的 TaskStartCreateTasks 函数代码如下,它创立了两个应用任务 Task0 和 Task1: void TaskStartCreateTasks (void)INT8U i;for (i = 0; i < N_TASKS; i+) / Create tasksTaskDatai = i; / Each task will display itsown informationOSTaskCreate(Tas

28、k0, (void *)&TaskData0, &TaskStk0TASK_STK_SIZE - 1, 5);OSTaskCreate(Task1, (void *)&TaskData1, &TaskStk1TASK_STK_SIZE - 1, 6); TaskStart 任务完成上述操作后将自己挂起,操作系统将调度当前优先级最高的应用任务 Task0 运行.(2) 应用任务应用任务 Task0 运行后将自己挂起,之后操作系统就会调度处于就绪状态的优先级最高的 任务,具体代码如下:void Task0 (void *pdata) INT8U i;INT8U er

29、r;i=*(int *)pdata; for (;)printf("Application tasks switched %d times!nr",+count);printf("TASK_0 IS RUNNING nr");printf("task_1 is suspended!nr");printf(*nr");err=OSTaskSuspend(5); / suspend itself应用任务 Task1 运行后将 Task0 唤醒,使其进入到就绪队列中:void Task1 (void *pdata)INT8U i;

30、INT8U err; i=*(int *)pdata;for (;)OSTimeDly(150);printf("Application tasks switched %d times!nr",+count); printf("task_0 is suspended!nr");prin tf("TASK_1 IS RUNNING*nr");printf(OSTimeDly(150);err=0STaskResume(5); /* resume taskO */三、运行及观察应用输出信息,当我们在根据本实验手册第一局部所描述的方法建立应

31、用工程并完成构建将看到在卩C/OS- n内核的调度治理下,LambdaEDU调试器的限制下运行构建好的程序后, 两个应用任务不断切换执行的情形:四、本实验中用到的Q/OS- n相关函数4.1 OSTaskCreate()OSTaskCreate ()建立一个新任务.任务的建立可以在多任务环境启动之前,也可以在 正在运行的任务中建立.中断处理程序中不能建立任务.一个任务必须为无限循环结构,不能有返回点.OSTaskCreate ()是为与先前的卩 C/OS版本保持兼容,新增的特性在OSTaskCreateExt()函数中.无论用户程序中是否产生中断,在初始化任务堆栈时,堆栈的结构必须与CPU中断

32、后存放器入栈的顺序结构相同.详细说明请参考所用处理器的手册.函数原型:INT8U OSTaskCreate( void (*task)(void *pd),void *pdata,OS_STK *ptos,INT8U prio);参数说明:task 是指向任务代码首地址的指针.pdata 指向一个数据结构,该结构用来在建立任务时向任务传递参数.ptos 为指向任务堆栈栈顶的指针.任务堆栈用来保存局部变量,函数参数,返回地址 以及任务被中断时的 CPU 存放器内容. 任务堆栈的大小决定于任务的需要及预计的中断嵌 套层数. 计算堆栈的大小, 需要知道任务的局部变量所占的空间, 可能产生嵌套调用的函

33、数, 及中断嵌套所需空间.如果初始化常量 OS_STK_GROWTH 设为 1,堆栈被设为从内存高 地址 向 低 地 址 增 长 , 此时 ptos 应 该 指 向任 务堆 栈 空 间 的 最 高 地 址 .反之,如果OS_STK_GROWTH 设为0,堆栈将从内存的低地址向高地址增长.prio为任务的优先级.每个任务必须有一个唯一的优先级作为标识.数字越小,优先级越高.返回值:OSTaskCreate()的返回值为下述之一:OS_NO_ERR :函数调用成功.OS_PRIO_EXIST :具有该优先级的任务已经存在.OS_PRIO_INV ALID :参数指定的优先级大于 OS_LOWEST

34、_PRIO . OS_NO_MORE_TCB :系统中没有 OS_TCB 可以分配给任务了.任务堆栈必须声明为 OS_STK 类型.在任务中必须调用卩C/OS提供的下述过程之一:延时等待、任务挂起、等待事件发生 (等待信号量,消息邮箱、消息队列) ,以使其他任务得到 CPU .用 户 程 序 中 不 能 使 用 优 先 级 0 , 1 , 2 , 3 , 以 及 OS_LOWEST_PRIO-3,OS_LOWEST_PRIO-2, OS_LOWEST_PRIO-1, OS_LOWEST_PRIO.这些优先级卩 C/OS 系 统保存,其余的 56 个优先级提供应应用程序.4.2 OSTaskSu

35、spend()OSTaskSuspend () 无条件挂起一个任务 .调用此函数的任务也可以传递参数 OS_PRIO_SELF ,挂起调用任务本身.当前任务挂起后,只有其他任务才能唤醒.任务挂起 后,系统会重新进行任务调度, 运行下一个优先级最高的就绪任务. 唤醒挂起任务需要调用 函数 OSTaskResume ().任务的挂起是可以叠加到其他操作上的.例如,任务被挂起时正在进行延时操作,那么 任务的唤醒就需要两个条件: 延时的结束以及其他任务的唤醒操作. 又如, 任务被挂起时正 在等待信号量, 当任务从信号量的等待对列中去除后也不能立即运行, 而必须等到被唤醒后. 函数原型:INT8U OS

36、TaskSuspend( INT8U prio);参数说明:prio 为指定要获取挂起的任务优先级,也可以指定参数 OS_PRIO_SELF ,挂起任务本 身.此时,下一个优先级最高的就绪任务将运行.返回值:OSTaskSuspe nd()的返回值为下述之一:OS_NO_ERR :函数调用成功.OS_TASK_ SUSPEND_IDLE :试图挂起 Q/OS-II中的空闲任务 (Idle task).此为非法 操作.OS_PRIO_INV ALID :参数指定的优先级大于 OS_LOWEST_PRIO 或没有设定 OS_PRIO_SELF 的值.OS_TASK_ SUSPEND _PRIO :

37、要挂起的任务不存在.在程序中 OSTaskSuspend ()和 OSTaskResume ()应该成对使用.用 OSTaskSuspend ()挂起的任务只能用OSTaskResume ()唤醒.4.3 OSTaskResume()OSTaskResume ()唤醒一个用 OSTaskSuspend ()函数挂起的任务. OSTaskResume ()也是唯一能“解挂挂起任务的函数.函数原型:INT8UOSTaskResume ( INT8U prio);参数说明:prio 指定要唤醒任务的优先级.返回值:OSTaskResume ()的返回值为下述之一:OS_NO_ERR :函数调用成功.

38、OS_TASK_RESUME_PRIO :要唤醒的任务不存在.OS_TASK_NOT_SUSPENDED :要唤醒的任务不在挂起状态.OS_PRIO_INV ALID :参数指定的优先级大于或等于 OS_LOWEST_PRIO .五、实验过程中遇到的问题及体会实验过程中体会到了嵌入式开发的乐趣,对上课老师所讲的内容有了进一步的熟悉与理解.实验三 信号量:哲学家就餐问题的实现一、实验目的掌握在基于嵌入式实时操作系统 uC/OS-II 的应用中,任务使用信号量的一般原理.通 过经典的哲学家就餐实验,了解如何利用信号量来对共享资源进行互斥访问.二、实验原理及程序结构1. 实验设计掌握在基于嵌入式实时

39、操作系统 uC/OS-II 的应用中,任务使用信号量的一般原理.通 过经典的哲学家就餐实验,了解如何利用信号量来对共享资源进行互斥访问.2. 源程序说明五个哲学家任务(phi、ph2、ph3、ph4、ph5)主要有两种过程:思考(即睡眠一段时 间)和就餐. 每个哲学家任务在就餐前必须申请并获得一左一右两支筷子, 就餐完毕后释放 这两支筷子.五个哲学家围成一圈, 每两人之间有一支筷子. 一共有五支筷子,在该实验中 用了五个互斥信号量来代表.每个任务的代码都一样,如下所示:void Task (void *pdata)INT8U err;INT8U i;INT8U j;i=*(int *)pdat

40、a;j=(i+1) % 5;uC/OS-II 实验指导书- 47 -for (;)TaskThinking2Hungry(i);OSSemPend(forki, 0, &err);OSSemPend(forkj, 0, &err); /* Acquire semaphores to eat */ TaskEat(i);OSSemPost(forkj);OSSemPost(forki); /* Release semaphore */ OSTimeDly(200); /* Delay 10 clock tick */ 操作系统配置修改 uC_OS-II/OS_CFG .h :#d

41、efine OS_MAX_EVENTS 10 /* 最多可以有 10 个事件 */#define OS_MAX_FLAGS 5 /* 最多可以有 5 个事件标志 */#define OS_MAX_MEM_PART 5 /* 最多可以划分 5 个内存块 */#define OS_MAX_QS 2 /* 最多可以使用 2 个队列 */#define OS_MAX_TASKS 8 /* 最多可以创立 8 个任务 */#define OS_LOWEST_PRIO 14 /* 任务优先级不可以大于 14*/#define OS_TASK_IDLE_STK_SIZE 1024 /* 空闲任务堆栈大小 */

42、#define OS_TASK_STA T_EN 1 /* 是否允许使用统计任务 */#define OS_TASK_STA T_STK_SIZE 1024 /* 统计任务堆栈大小 */#define OS_FLAG_EN 1 /* 是否允许使用事件标志功能 */#define OS_FLAG_W AIT_CLR_EN 1 /* 是否允许等待去除事件标志 */#define OS_FLAG_ACCEPT_EN 1 /* 是否允许使用 OSFlagAccept()*/#define OS_FLAG_DEL_EN 1 /* 是否允许使用 OSFlagDel()*/#define OS_FLAG_Q

43、UERY_EN 1 /* 是否允许使用 OSFlagQuery()*/#define OS_MBOX_EN 0 /* 是否允许使用邮箱功能 */#define OS_MEM_EN 0 /* 是否允许使用内存治理的功能 */#define OS_MUTEX_EN 0 /* 是否允许使用互斥信号量的功能 */#define OS_Q_EN 0 /* 是否允许使用队列功能 */#define OS_SEM_EN 1 /* 是否允许使用信号量功能 */#define OS_SEM_ACCEPT_EN 1 /* 是否允许使用 OSSemAccept()*/#define OS_SEM_DEL_EN 1

44、/* 是否允许使用 OSSemDel() */#define OS_SEM_QUERY_EN 1 /* 是否允许使用 OSSemQuery()*/#define OS_TASK_CHANGE_PRIO_EN 1 /*是 否 允 许 使 用OSTaskChangePrio()*/#define OS_TASK_CREATE_EN 1 /* 是否允许使用 OSTaskCreate()*/#define OS_TASK_CREATE_EXT_EN 1 /* 是否允许使用 OSTaskCreateExt()*/#define OS_TASK_DEL_EN 1 /* 是否允许使用 OSTaskDel()

45、*/#define OS_TASK_SUSPEND_EN 1 /* 是 否 允 许 使 用 OSTaskSuspend() and OSTaskResume()*/#define OS_TASK_QUERY_EN 1 /* 是否允许使用 OSTaskQuery()*/#define OS_TIME_DL Y_HMSM_EN 1 /* 是 否 允 许 使 用 OSTimeDlyHMSM()*/#define OS_TIME_DL Y_RESUME_EN 1 /* 是 否 允 许 使 用 OSTimeDlyResume()*/#define OS_TIME_GET_SET_EN 1 /* 是否允许

46、使用 OSTimeGet() 和 OSTimeSet()*/#define OS_SCHED_LOCK_EN 1 /*是 否 允 许 使 用 OSSchedLock() 和OSSchedUnlock()*/#define OS_TICKS_PER_SEC 200 /* 设置每秒之内的时钟节拍数目 */三、运行及观察应用输出信息开始,所有的哲学家先处于 thinking 状态,然后都进入 hungry 状态:后首先获得两个信号量的1、3号哲学家开始eat ing,待他们释放相关信号量之 后,哲学家 2、 5、 4 获得所需的信号量并 eating: 应用如此这般地循环执行程序下去四、本实验中用到

47、的 Q/OS- U相关函数4.1 OSSemCreate()OSSemCreate ()函数建立并初始化一个信号量.信号量的作用如下:允许一个任务和其他任务或者中断同步取得设备的使用权 标志事件的发生函数原型:OS_EVENT *OSSemCreate ( WORD value)参数说明:value 参数是所建立的信号量的初始值,可以取 0至U 65535之间的任何值. 返回值:OSSemCreate()函数返回指向分配给所建立的信号量的限制块的指针.如果没有可用的 限制块,OSSemCreate()函数返回空指针.必须先建立信号量,然后使用.4.2 OSSemPe nd()OSSemPend ()函数用于任务试图取得设备的使用权,任务需要和其他任务或中断同 步,任务需要等待特定事件的发生的场合.如果任务调用OSSemPend ()函数时,信号量的值大于零,OSSemPend ()函数递减该值并返回该值.如果调

温馨提示

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

最新文档

评论

0/150

提交评论