ucOSII范例分析01汇总课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《ucOSII范例分析01汇总课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ucOSII 范例 分析 01 汇总 课件
- 资源描述:
-
1、嵌入式操作系统ucOS-II分析ucOS-II应用程序基本结构void task(void*pdata)INT8U err;InitTimer();/可选For(;)/你的应用程序代码 .OSTimeDly(1);/可选一些重要的ucOS-II API)任务类)消息类)同步类)时间类)临界区与事件类任务类和时间类是必须要首先掌握的两种类型的API)OSTaskCreate函数函数 n这个函数应该至少在main函数内调用一次,在OSInit函数调用之后调用,以创建一个任务。n系统首先从TCB空闲列表内申请一个空的TCB指针,然后根据用户给出的参数初始化任务堆栈,并在内部的任务就绪表内标记该任务为
2、就绪状态。最后返回,这样一个任务就创建成功了。)OSTaskSuspend函数函数 n将指定的任务挂起。如果挂起的是当前任务,会引发系统执行任务切换先导函数OSShed来进行一次任务切换。n这个函数只有一个优先级参数,在系统内部,优先级除了表示一个任务执行的先后次序外,还起着区分每一个任务的作用,即优先级也是任务的ID。所以uCOS-II不允许出现相同优先级的任务。)OSTaskResume函数函数 n将指定的已经挂起的任务恢复成就绪状态。如果恢复任务的优先级高于当前任务,那么还会引发一次任务切换。n参数类似OSTaskSuspend函数,为指定任务的优先级。需要特别说明是,本函数并不要求和O
3、STaskSuspend函数成对使用。)OS_ENTER_CRITICAL宏宏 n分析一下OS_CPU.H文件,它涉及特定CPU的实现。一般都被替换为一条或者几条嵌入式汇编代码。其实,它就是关中断。n只要任务不主动放弃CPU使用权,别的任务就没有占用CPU的机会,这个任务就是独占了。进入临界区后,这个应宏尽量少用,它会破坏系统的一些服务,尤其是时间服务。并使系统对外界响应性能降低。)OS_EXIT_CRITICAL宏宏 n与OS_ENTER_CRITICAL配套使用的一个宏,在系统手册说明里它是退出临界区,其实就是重新开中断。n它必须和OS_ENTER_CRITICAL成对出现,否则会带来意想
4、不到的后果,如系统会崩溃。我们应尽量少用这两个宏调用,因为他们的确会破坏系统的多任务性能。)OSTimeDly函数函数 n这是调用最多的一个函数,它的功能是先挂起当前任务,然后进行任务切换,在指定的时间到来之后,将当前任务恢复为就绪状态,但是并不一定运行,如果恢复后是优先级最高的就绪任务话,那么就运行之。n可以将任务延时一定时间后再执行它,依靠时钟机制进行任务切换,暂时放弃CPU的使用权,但多任务性能会降低。ucOS-II范例的源码分析INCLUDES.H nucOS-II中所有的*.C 文件都包括了以下定义:#include includes.h“n唯一的缺点是INCLUDES.H中许多头文
5、件在一些*.C文件的编译中是不需要的。虽然逐个编译这些文件要花费额外的时间,但代码的可移植性却增加了。不依赖于编译的数据类型 可移植型数据类型的程序可移植型数据类型的程序Typedef unsigned char BOOLEAN;Typedef unsigned char INT8U;Typedef signed char INT8S;Typedef unsigned int INT16U;Typedef signed int INT16S;Typedef unsigned long INT32U;Typedef signed long INT32S;Typedef float FP32;Ty
6、pedef double FP64;#define BYTE INT8S -|#define UBYTE INT8U -|#define WORD INT16S -|ucos-ucosII#define UWORD INT16U -|#define LONG INT32S -|#define ULONG INT32U -|全局变量 n定义全局宏的程序定义全局宏的程序#ifdef xxx_GLOBALS#define xxx_EXT#else#define xxx_EXT extern#endif.H 文件中每个全局变量都加上了xxx_EXT的前缀。xxx代表模块的名字。该模块的.C文件中有以下
7、定义:#define xxx_GLOBALS#include includes.huCOS_II.H中有以下定义:n#ifdef OS_GLOBALSn#define OS_EXTn#elsen#define OS_EXT externn#endif nOS_EXT INT32U OSIdleCtr;nOS_EXT INT32U OSIdleCtrRun;nOS_EXT INT32U OSIdleCtrMax;uCOS_II.C中有以下定义:n#define OS_GLOBALSn#include“includes.h”当编译器处理uCOS_II.C时,它使uCOS_II.H变成如下所示,因为
8、OS_EXT被设置为空。编译器就会将这些全局变量分配到内存中。nINT32U OSIdleCtr;nINT32U OSIdleCtrRun;nINT32U OSIdleCtrMax;当编译器处理其他.C文件时,头文件变成了如下的样子,因为OS_GLOBAL没有定义,所以OS_EXT被定义为extern。nextern INT32U OSIdleCtr;nextern INT32U OSIdleCtrRun;nextern INT32U OSIdleCtrMax;在这种情况下,不产生内存分配,而任何.C文件都可以使用这些变量。这样的就只需在.H 文件中定义一次就可以了。OS_ENTER_CRIT
9、ICAL()和和 OS_EXIT_CRITICAL()nOS_ENTER_CRITICAL()关中断;OS_EXIT_CRITICAL()开中断。n是为了保护临界段代码,这些代码与处理器有关。宏的定义在OS_CPU.H中。n关中断会影响中断延迟,所以要特别小心。用户还可以用信号量来保护临界段代码。基于PC的服务 nPC.C 文件和 PC.H 文件是范例中使用到的一些基于PC的服务程序。nPC.C包括字符显示,时间度量和其他各种服务。所有的函数都以PC_为前缀。字符显示 nPC_DispClrScr()Clear the screennPC_DispClrLine()Clear a single
10、 row(or line)nPC_DispChar()Display a single ASCII character anywhere on the screennPC_DispStr()Display an ASCII string anywhere on the screen时间度量 n用PC的82C54定时器2测试一个函数的运行花了多少时间。被测的程序代码放在函数PC_ElapsedStart()和PC_ElapsedStop()之间来测量。在用这两个函数之前,应该调用PC_ElapsedInit()来初始化,它主要是计算运行这两个函数本身所附加的的时间。这样,PC_ElapsedSt
11、op()函数中返回的数值就是准确的测量结果了。这两个函数都不具备可重入性,不要有多个任务同时调用这两个函数。测量PC_DisplayChar()的执行时间(us)n测量代码执行时间的程序测量代码执行时间的程序INT16U time;PC_ElapsedInit();.PC_ElapsedStart();PC_DispChar(40,24,A,DISP_FGND_WHITE);time=PC_ElapsedStop();应用应用 C/OS-II 的范例的范例 n用BC IDE(Integrated Development Environment)编译通过,在WindowsXP 的DOS窗口下编译
12、运行。可执行代码在每个范例的OBJ子目录中。IDE中编译选项中编译选项nCode generation Model:LargeOptions:Treat enums as intsAssume SS Equals DS:Default for memory modelnAdvanced code generation Floating point:EmulationInstruction set:80186Options:Generate underbars Debug info in OBJs Fast floating pointIDE中编译选项中编译选项nOptimizationsGlo
13、bal register allocation Invariant code motion Induction variables Loop optimization Suppress redundant loads Copy propagation Dead code elimination Jump optimization In-line intrinsic functionsIDE中编译选项中编译选项nRegister variables AutomaticnCommon subexpressions Optimize globallynOptimize for Speed例例1n有1
14、3个任务(包括 C/OS-II 的空闲任务和一个计算CPU利用率的任务)。TaskStart()在函数main()中建立,功能是建立其它任务并且在屏幕上显示如下统计信息:n每秒钟任务切换次数;CPU利用百分率;寄存器切换次数;目前日期和时间;C/OS-II的版本号;n TaskStart()还检查是否按下ESC键,以决定是否返回到DOS。n其余10个任务基于相同的代码Task();每个任务在屏幕上随机的位置显示一个0到9的数字。main()nmain()程序从清整个屏幕开始,为的是保证屏幕上不留有以前的DOS下的显示。n用户在使用任何服务之前先调用OSInit()。建立两个任务:空闲任务和统计
15、任务,前者在没有其它任务处于就绪态时运行;后者计算CPU的利用率。main()程序程序nvoid main(void)PC_DispClrScr(DISP_FGND_WHITE+DISP_BGND_BLACK);(1)OSInit();(2)PC_DOSSaveReturn();/保存当前DOS环境 (3)PC_VectSet(uCOS,OSCtxSw);/设置 CPU寄存器切换 (4)RandomSem=OSSemCreate(1);/信号量置为1,在某一时刻只有一个任务可以调用随机数产生函数 (5)OSTaskCreate(TaskStart,(void*)0,/启动多任务OSStart(
16、)之前,用户至少要先建立一个任务如TaskStart()(void*)&TaskStartStkTASK_STK_SIZE-1,0);(6)OSStart();/启动多任务 (7)OSInit()初始化【在OS_CORE.C中定义】void OSInit(void)#if OS_VERSION=204 OSInitHookBegin();/系统初始化开始接口函数#endif OS_InitMisc();/初始化变量 OS_InitRdyList();/初始化任务就绪列表 OS_InitTCBList();/初始化任务控制块列表 OS_InitEventList();/初始化事件控制块列表 OS
17、Init()初始化(续)#if(OS_VERSION=251)&(OS_FLAG_EN 0)&(OS_MAX_FLAGS 0)OS_FlagInit();/事件标志结构初始化#endif#if(OS_MEM_EN 0)&(OS_MAX_MEM_PART 0)OS_MemInit();/内存管理初始化#endif#if(OS_Q_EN 0)&(OS_MAX_QS 0)OS_QInit();/消息队列初始化#endifOS_InitTaskIdle();/创建空闲任务(无条件)#if OS_TASK_STAT_EN 0 OS_InitTaskStat();/创建统计任务#endif#if OS_V
18、ERSION=204 OSInitHookEnd();/系统初始化结束接口函数#endif#if OS_VERSION=270&OS_DEBUG_EN 0 OSDebugInit();#endifOS_InitMisc()初始化变量 nOSIntNesting =0;/清除中断嵌套计数器 nOSLockNesting=0;/清除调度锁定计数器 nOSTaskCtr =0;/任务数清零nOSRunning =FALSE;/系统多任务没有执行 nOSIdleCtr =0L;/清除空闲任务计数器nOSCtxSwCtr =0;/清除程序切换计数器 OS_InitRdyList()初始化任务就绪列表 n
19、static void OS_InitRdyList(void)INT8U i;INT8U *prdytbl;OSRdyGrp =0 x00;/清除任务就绪表 prdytbl =&OSRdyTbl0;/将OSRdyTbl数组全部初始化0 for(i=0;i OS_RDY_TBL_SIZE;i+)*prdytbl+=0 x00;/把任务就绪表里面所有的项目全部清零 OSPrioCur =0;/当前运行任务的优先级寄存器清零 OSPrioHighRdy=0;/将处于就绪状态的最高优先级的任务寄存器清零 OSTCBHighRdy =(OS_TCB*)0;/将处于就绪态的最高优先级的任务控制块指针寄存
20、器清零 OSTCBCur =(OS_TCB*)0;/将当前运行任务的任务控制块指针寄存器清零 OSTCBList =(OS_TCB*)0;/任务控制块列表清零 for(i=0;i (OS_LOWEST_PRIO+1);i+)OSTCBPrioTbli=(OS_TCB*)0;/清除优先级列表,这个列表存储各个优先级对应的任务控制块的地址,系统用它来寻找下一个要运行的任务地址OS_InitTCBList()初始化任务控制块列表nstatic void OS_InitTCBList(void)INT8U i;OS_TCB *ptcb1;OS_TCB *ptcb2;OS_MemClr(INT8U*)&
21、OSTCBTbl0,sizeof(OSTCBTbl);/清除TCB OS_MemClr(INT8U*)&OSTCBPrioTbl0,sizeof(OSTCBPrioTbl);/清除优先级表 ptcb1=&OSTCBTbl0;/任务控制块列表的第一个任务块地址给变量PTCB1 ptcb2=&OSTCBTbl1;/任务控制块列表的第二个任务块地址给变量PTCB2 for(i=0;i OSTCBNext=ptcb2;#if OS_TASK_NAME_SIZE 1 ptcb1-OSTCBTaskName0=?;/*Unknown name */ptcb1-OSTCBTaskName1=OS_ASCII
22、_NUL;/把前一个任务控制块的下一个任务指针指向下一个任务控制块#endif ptcb1+;ptcb2+;ptcb1-OSTCBNext=(OS_TCB*)0;/把最后一个人物控制块的下个指针清零#if OS_TASK_NAME_SIZE 1 ptcb1-OSTCBTaskName0=?;/*Unknown name */ptcb1-OSTCBTaskName1=OS_ASCII_NUL;#endif OSTCBList =(OS_TCB*)0;/TCB列表初始化 OSTCBFreeList =&OSTCBTbl0;/把第一个任务控制块的地址送给空闲任务控制块列表 建立其它任务的任务建立其它
展开阅读全文