uCOS II操作系统简介及实验解读课件.ppt

上传人:牧羊曲112 文档编号:1481537 上传时间:2022-11-30 格式:PPT 页数:85 大小:1.10MB
返回 下载 相关 举报
uCOS II操作系统简介及实验解读课件.ppt_第1页
第1页 / 共85页
uCOS II操作系统简介及实验解读课件.ppt_第2页
第2页 / 共85页
uCOS II操作系统简介及实验解读课件.ppt_第3页
第3页 / 共85页
uCOS II操作系统简介及实验解读课件.ppt_第4页
第4页 / 共85页
uCOS II操作系统简介及实验解读课件.ppt_第5页
第5页 / 共85页
点击查看更多>>
资源描述

《uCOS II操作系统简介及实验解读课件.ppt》由会员分享,可在线阅读,更多相关《uCOS II操作系统简介及实验解读课件.ppt(85页珍藏版)》请在三一办公上搜索。

1、uC/OS-II操作系统,uC/OS-II操作系统简介及开发过程,内 容,一、 uCOS-II操作系统简介二、 uCOS-II操作系统内核结构三、 uCOS-II操作系统任务管理四、 uCOS-II操作系统内存管理五、 uCOS-II操作系统时间管理六、 uCOS-II操作系统任务间的通讯七、 uCOS-II操作系统移植八、 uCOS-II操作系统实验,一、 uCOS-II操作系统简介,1.1 uC/OS-II简介1.2 uC/OS-II特点1.3 C/OS-II应用,1.1 uC/OS-II简介,1、uC/OS-II是一个简单、高效的嵌入式实时操作系统内核2、支持 x86、ARM、Power

2、PC、MIPS 等众多体系结构3、可从www.ucos-网站上获得全部源码及其在各种体系结构平台上的移植范例。,1.2 uC/OS-II特点,1、uC/OS-II内核具有很强的可移植性。2、具有可抢占的实时多任务调度功能。3、提供了许多系统服务,如信号量、消息队列、邮箱、内存管理、时间函数等4、这些功能可以根据不同的需求进行裁减。,1.3 C/OS-II的各种商业应用,全世界有数百种产品在应用:医疗器械移动电话路由器工业控制GPS 导航系统智能仪器更多,二、 uCOS-II操作系统内核结构,2.1 临界段2.2 任务2.3 任务状态2.4 任务控制块2.5 任务就绪表,2.6 任务调度2.7

3、中断处理2.8 时钟节拍 2.9 C/OS-初始化2.10 C/OS-启动,目的:为了实现资源共享。实现方法:进入临界段时关中断,退出临界段时开中断。这使得C/OS-能够在临界段代码时避免被其它任务或中断服务所中断。 C/OS-定义两个宏(macros)来开关中断。分别是:进入临界段:OS_ENTER_CRITICAL()退出临界段:OS_EXIT_CRITICAL()。这两个宏的定义取决于所用的微处理器,每种微处理器都有自己的OS_CPU.H文件。,2.1 临界段(Critical Sections),2.2 任务(task),一个任务通常是一个无限的循环:void mytask(void

4、*pdata) do init while (1) do something; waiting; do something; ,任务(task),C/OS-可以管理多达64个任务。优先级为0-63 优先级号越低,任务的优先级越高。每个任务的优先级不能相同。保留优先级:高优先级:0、1、2、3低优先级:OS_LOWEST_PRIO-3、OS_LOWEST_PRI0-2,OS_LOWEST_PRI0-1以及OS_LOWEST_PRI0用户可以有多达56个应用任务。,2.3 任务状态,任务状态,休眠态 - OSTaskCreate()或OSTaskCreateExt() - 就绪态等待态,就绪态,运

5、行态 - OSTaskDel() - 休眠态就绪态 - OSStart() - 运行态运行态 - OSTimeDly()或OSTimeDlyHMSM() , OSSemPend(),OSMboxPend(),或OSQPend() - 等待态等待态 - OSTimeTick() -就绪态空闲任务 - OSTaskIdle(),2.4 任务控制块(TCB),任务控制块 OS_TCB 是一个数据结构,保存该任务的相关参数,包括任务堆栈指针,状态,优先级,任务表位置,和任务链表指针等。一旦任务建立了,任务控制块OS_TCBs将被赋值。所有的任务控制块分为两条链表,空闲链表和使用链表。,任务控制块结构的

6、主要成员,OS_STK *OSTCBStkPtr; /*当前任务栈顶的指针*/struct os_tcb *OSTCBNext; /*任务控制块的双重链接指针*/struct os_tcb *OSTCBPrev; /*任务控制块的双重链接指针*/void *OSTCBExtPtr; /*用户定义的任务控制块扩展*/OS_EVENT *OSTCBEventPtr; /*事件控制块的指针*/void *OSTCBMsg; /*消息的指针*/INT16U OSTCBDly; /*任务延时*/INT8U OSTCBStat; /*任务的状态字*/INT8U OSTCBPrio; /*任务优先级*/IN

7、T8U OSTCBX; /*用于加速进入就绪态的过程*/ INT8U OSTCBY; /*用于加速进入就绪态的过程*/ INT8U OSTCBBitX; /*用于加速进入就绪态的过程*/ INT8U OSTCBBitY; /*用于加速进入就绪态的过程*/BOOLEAN OSTCBDelReq; /*用于表示该任务是否要删除*/,2.5 任务就绪表(Ready List),每个任务的就绪态标志都放入就绪表中的,就绪表中有两个变量OSRdyGrp和OSRdyTbl。 在OSRdyGrp中,任务按优先级分组,8个任务为一组。OSRdyGrp中的每一位表示8组任务中每一组中是否有进入就绪态的任务。任务

8、进入就绪态时,就绪表OSRdyTbl中的相应元素的相应位也置位。,任务就绪表(Ready List),根据就绪表确定最高优先级,通过OSRdyGrp值确定高3位,假设OSRdyGrp0 x08,对应OSRdyTbl3,查表(OSUnMapTbl)得到3(八进制,二进制011);通过OSRdyTbl3的值来确定低3位,假设OSRdyTbl30 x3a,查表得优先级为1;则最高优先级的任务为3*8+1=25,2.6 任务调度,C/OS是抢占式实时多任务内核,优先级最高的任务一旦准备就绪,则拥有CPU的所有权开始投入运行。C/OS中不支持时间片轮转法,每个任务的优先级要求不一样且是唯一的,所以任务调

9、度的工作就是:查找准备就绪的最高优先级的任务并进行上下文切换。C/OS任务调度所花的时间为常数,与应用程序中建立的任务数无关。,任务调度,C/OS-总是运行进入就绪态任务中优先级最高的那一个。确定哪个任务优先级最高,下面该哪个任务运行了的工作是由调度器(Scheduler)完成的。 任务级的调度是由函数OSSched()完成的。中断级的调度是由另一个函数OSIntExt()完成的,这个函数将在以后描述。,2.7 中断处理,用户中断服务子程序流程: 1、保存全部CPU寄存器; 2、调用OSIntEnter或OSIntNesting直接加1;3、执行用户代码做中断服务; 4、调用OSIntExit

10、();5、恢复所有CPU寄存器;6、执行中断返回指令;,OSIntEnter(),void OSIntEnter (void) OS_ENTER_CRITICAL(); OSIntNesting+; OS_EXIT_CRITICAL();,OSIntExit(),OS_ENTER_CRITICAL();if (-OSIntNesting | OSLockNesting) = 0) OSIntExitY = OSUnMapTblOSRdyGrp;OSPrioHighRdy = (INT8U)(OSIntExitY 3) + OSUnMapTblOSRdyTblOSIntExitY); if (O

11、SPrioHighRdy != OSPrioCur) OSTCBHighRdy=OSTCBPrioTblOSPrioHighRdy; OSCtxSwCtr+; OSIntCtxSw(); OS_EXIT_CRITICAL();,中断与时钟节拍,当发生中断时,首先应保护现场,将CPU寄存器入栈,再处理中断函数,然后恢复现场,将CPU寄存器出栈,最后执行中断返回。uC/OS中提供了OSIntEnter()和OSIntExit()告诉内核进入了中断状态。时钟节拍是一种特殊的中断,是操作系统的心脏。可以对任务列表进行扫描,判断是否有延时任务应该处于准备就绪状态,最后进行上下文切换。,2.8 时钟节拍,

12、C/OS需要用户提供周期性信号源,用于实现时间延时和确认超时。节拍率应在每秒10次到100次之间,或者说10到100Hz。时钟节拍率越高,系统的额外负荷就越重。时钟节拍的实际频率取决于用户应用程序的精度。时钟节拍源可以是专门的硬件定时器,也可以是来自50/60Hz交流电源的信号。 用户必须在多任务系统启动以后再开启时钟节拍器,也就是在调用OSStart()之后。,时钟节拍中断服务子程 (OSTickISR),void OSTickISR(void) 保存处理器寄存器的值; 调用OSIntEnter()或是将OSIntNesting加1; 调用OSTimeTick(); 调用OSIntExit(

13、); 恢复处理器寄存器的值; 执行中断返回指令;,2.9 C/OS-初始化,在调用C/OS-的任何其它服务之前,C/OS-要求用户首先调用系统初始化函数OSInit()。OSInit()建立空闲任务idle task,这个任务总是处于就绪态的。空闲任务OSTaskIdle()的优先级总是设成最低,即OS_LOWEST_PRIO。 C/OS-还初始化了4个空数据结构缓冲区。,C/OS-初始化后的一些数据结构,C/OS-初始化后的空缓冲区,2.10 C/OS-的启动,多任务的启动是用户通过调用OSStart()实现的。然而,启动C/OS-之前,用户至少要建立一个应用任务。 OSInit(); /*

14、 初始化uC/OS-II*/ 调用OSTaskCreate()或OSTaskCreateExt(),创建至少一个任务 ; OSStart(); /*开始多任务调度!永不返回 */,OSStart,if (OSRunning = FALSE) y = OSUnMapTblOSRdyGrp; x = OSUnMapTblOSRdyTbly; OSPrioHighRdy = (INT8U)(y 3) + x); OSPrioCur = OSPrioHighRdy; OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy; OSTCBCur = OSTCBHighRdy; O

15、SStartHighRdy();/*高优先级就绪任务启动函数*/ ,三、 uCOS-II操作系统任务管理,3.1 任务创建3.2 任务删除3.3 任务调度器3.4 任务切换,3.1 任务创建,想让C/OS-管理用户的任务,用户必须要先建立任务。 用户可以通过传递任务地址和其它参数到以下两个函数之一来建立任务:OSTaskCreate() OSTaskCreateExt()。 任务不能由中断服务程序(ISR)来建立。,使任务进入就绪态,如果prio是任务优先级,也是任务的识别号,则将任务放入就绪表,就是使任务进入就绪态的方法是:OSRdyGrp |=OSMapTblprio3;OSRdyTblp

16、rio3 |=OSMapTblprio (0001 0000 b),使任务脱离就绪态,将任务就绪表OSRdyTblprio3相应元素的相应位清零,而且当OSRdyTblprio3中的所有位都为零时,即全组任务中没有一个进入就绪态时,OSRdyGrp的相应位才为零。if(OSRdyTblprio3,3.2 任务删除OSTaskDel(),删除任务,是说任务将返回并处于休眠状态,并不是说任务的代码被删除了 .OSTaskDel()一开始应确保用户所要删除的任务并非是空闲任务.用户可以删除statistic任务 .确保用户不是在ISR例程中去试图删除一个任务,3.3 任务调度器,void OSSch

17、ed (void) INT8U y; OS_ENTER_CRITICAL(); if (OSLockNesting | OSIntNesting) = 0) y = OSUnMapTblOSRdyGrp; OSPrioHighRdy = (INT8U)(y 3) + OSUnMapTblOSRdyTbly); if (OSPrioHighRdy != OSPrioCur) OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy; OSCtxSwCtr+; OS_TASK_SW(); OS_EXIT_CRITICAL();,3.4 任务切换 (OS_TASK_SW),任

18、务切换由以下两步完成 :将被挂起任务的微处理器寄存器推入堆栈 。将较高优先级的任务的寄存器值从栈中恢复到寄存器中 。OSSched()的所有代码都属临界段代码。在寻找进入就绪态的优先级最高的任务过程中,为防止中断服务子程序把一个或几个任务的就绪位置位,中断是被关掉的。,任务级的任务切换OS_TASK_SW(),通过系统调用指令完成保护当前任务的现场恢复新任务的现场执行中断返回指令开始执行新的任务,调用OS_TASK_SW()前的数据结构,低优先级任务 OS_TCB,OSTCBCur(1),存贮器低地址,存贮器高地址,堆栈方向,SP,R1,R2,R3,R4,PC,PSW,存贮器低地址,存贮器高地

19、址,高优先级任务 OS_TCB,OSTCBHighRdy(3),(2),CPU,(4),(5),保存当前CPU寄存器的值,低优先级任务 OS_TCB,OSTCBCur,存贮器低地址,存贮器高地址,堆栈方向,SP,R1,R2,R3,R4,PC,PSW,存贮器低地址,存贮器高地址,高优先级任务 OS_TCB,OSTCBHighRdy(3),(2),CPU,(4),(5),(1),(3),重新装入要运行的任务,低优先级任务 OS_TCB,OSTCBCur,存贮器低地址,存贮器高地址,堆栈方向,SP,R1,R2,R3,R4,PC,PSW,存贮器低地址,存贮器高地址,高优先级任务 OS_TCB,OSTC

20、BHighRdyOSTCBCur(1),(2),CPU,(4),(4),(1),(3),(3),(4),任务切换OSCtxSw()的代码,Void OSCtxSw(void) 将R1,R2,R3及R4推入当前堆栈; OSTCBCurOSTCBStkPtr = SP; OSTCBCur = OSTCBHighRdy; OSPrioCur = OSPrioHighRdy; SP = OSTCBHighRdy OSTCBSTKPtr; 将R4,R3,R2及R1从新堆栈中弹出; 执行中断返回指令;,四、 uCOS-II操作系统内存管理,4.1 内存管理概述4.2 内存控制块4.3 内存管理初始化4.4

21、 建立内存分区4.5 分配内存块4.6 释放内存块,4.1 内存管理概述,在ANSI C中可以用malloc()和free()两个函数动态地分配内存和释放内存。在嵌入式实时操作系统中,容易产生内存碎片。 C/OS-II中,操作系统把连续的大块内存按分区来管理。每个分区中包含有整数个大小相同的内存块。在一个系统中可以有多个内存分区。这样,用户的应用程序就可以从不同的内存分区中得到不同大小的内存块。但是,特定的内存块在释放时必须重新放回它以前所属于的内存分区。,内存分区示意图,4.2 内存控制块,为了便于内存的管理,在C/OS-II中使用内存控制块(memory control blocks)的数

22、据结构来跟踪每一个内存分区,系统中的每个内存分区都有它自己的内存控制块。 typedef struct void *OSMemAddr; /*分区起始地址*/ void *OSMemFreeList;/*下一个空闲内存块*/ INT32U OSMemBlkSize;/*内存块的大小*/ INT32U OSMemNBlks;/*内存块数量*/ INT32U OSMemNFree;/*空闲内存块数量 */ OS_MEM;,4.3 内存管理初始化,如果要在C/OS-II中使用内存管理,需要在OS_CFG.H文件中将开关量OS_MEM_EN设置为1。这样C/OS-II 在启动时就会对内存管理器进行初始

23、化。(由OSInit调用OSMemInit实现 )该初始化主要建立一个内存控制块链表,(如下图)其中的常数OS_MAX_MEM_PART(见OS_CFG.H)定义了最大的内存分区数,该常数值至少应为2。,空闲内存控制块链表,4.4 建立内存分区OSMemCreate(),在使用一个内存分区之前,必须使用OSMemCreate()先建立该内存分区。该函数共有4个参数:内存分区的起始地址、分区内的内存块总块数、每个内存块的字节数和一个指向错误信息代码的指针。 每个内存分区必须含有至少两个内存块,每个内存块至少为一个指针的大小 。OS_MEM *CommTxBuf;INT8U CommTxPart1

24、0032;CommTxBuf = OSMemCreate(CommTxPart, 100, 32, ,4.5 分配内存块OSMemGet(),应用程序可以调用OSMemGet()函数从已经建立的内存分区中申请一个内存块。该函数的唯一参数是指向特定内存分区的指针,该指针在建立内存分区时,由OSMemCreate()函数返回。注意的是,用户可以在中断服务子程序中调用OSMemGet(),因为在暂时没有内存块可用的情况下,OSMemGet()不会等待,而是马上返回NULL指针。,4.6 释放内存块OSMemPut(),应用程序不再使用一个内存块时,必须及时地把它释放并放回到相应的内存分区中。这个操作

25、由OSMemPut()函数完成。 必须注意的是,OSMemPut()并不知道一个内存块是属于哪个内存分区的。 释放内存块时必须将它释放到正确的分区。,五、 uCOS-II操作系统时间管理,C/OS-(其它内核也一样)要求用户提供定时中断来实现延时与超时控制等功能。这个定时中断叫做时钟节拍,它应该每秒发生10至100次。时钟节拍的频率越高,系统的负荷就越重。 与时钟管理相关的系统服务有:OSTimeDLY()OSTimeDLYHMSM()OSTimeDlyResmue()OStimeGet()OSTimeSet(),六、 uCOS-II操作系统任务间的通讯,6.1 任务间通信手段6.2 事件控制

26、块 ECB6.3 信号量 semaphore6.4 邮箱 OSMbox,6.1 任务间通信手段,C/OS中,采用多种方法保护任务之间的共享数据和提供任务之间的通信。提供OS_ENTER_CRITICAL和OS_EXIT_CRITICAL来对临界资源进行保护利用函数OSSchedLock()和OSSchekUnlock()对任务调度函数上锁和开锁来实现数据共享 。提供了经典操作系统任务间通信方法:信号量、邮箱、消息队列,事件标志。,6.2 事件控制块ECB,所有的通信信号都被看成是事件(event), 一个称为事件控制块(ECB, Event Control Block)的数据结构来表征每一个具

27、体事件,ECB的结构如下:typedef struct void *OSEventPtr; /*指向消息或消息队列的指针*/ INT8U OSEventTblOS_EVENT_TBL_SIZE; /*等待任务列表*/ INT8U OSEventGrp; /*等待任务组*/ INT16U OSEventCnt; /*计数器(事件是信号量时)*/ INT8U OSEventType; /*事件类型:信号量、邮箱等*/ OS_EVENT;与TCB类似的结构,使用两个链表,空闲链表与使用链表,6.3 信号量 semaphore,信号量在多任务系统中用于:控制共享资源的使用权、标志事件的发生、使两个任务

28、的行为同步。uC/OS中信号量由两部分组成:信号量的计数值和等待该信号任务的等待任务表。信号量的计数值可以为二进制, 也可以是其他整数。系统通过OSSemPend( )和OSSemPost( )来支持信号量的两种原子操作P()和V()。P()操作减少信号量的值,如果新的信号量的值不大于0,则操作阻塞;V()操作增加信号量的值。,6.4 邮箱 OSMbox,邮箱是C/OS-II中另一种通讯机制,它可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量。该指针指向一个包含了特定“消息”的数据结构。 通过调用OSMboxCreate()函数来建立邮箱,并且要指定指针的初始值。一般情况下,这

29、个初始值是NULL,但也可以初始化一个邮箱,使其在最开始就包含一条消息。 OSMboxPend() 等待一个邮箱中的消息。OSMboxPost() 发送一个消息到邮箱中。,七、 uCOS-II操作系统移植,7.1 COS-II移植简介7.2 移植COS-II满足的条件7.3 C/OS-II在S3C2410上的移植,7.1 COS-II移植简介,所谓移植,是指使一个实时操作系统能够在某个微处理器平台上运行。COS-II的主要代码都是由标准的C语言写成的,移植方便。,7.2 移植COS-II满足的条件,处理器的C编译器能产生可重入代码 在程序中可以打开或者关闭中断 处理器支持中断,并且能产生定时中

30、断(通常在101000Hz之间) 处理器支承能够容纳一定量数据的硬件堆栈 处理器有将堆栈指针和其他CPU寄存器存储和读出到堆栈(或者内存)的指令,打开/关闭中断,在COS-II中,可以通过:OS_ENTER_CRITICAL () OS_EXIT_CRITICAL()宏来控制系统关闭或者打开中断。这需要处理器的支持。在ARM9处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中断。,处理器支持中断并且能产生定时中断,COS-II是通过处理器产生的定时器的中断来实现多任务之间的调度的。ARM9处理器上可以产生定时器中断。本系统工作在60MHz的主频下,定时器的中断的频率为100Hz。也就是系

31、统的响应时间为10ms。,处理器支持硬件堆栈,COS-II进行任务调度的时候,会把当前任务的CPU寄存器存放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以,寄存器的入栈和出栈是COS-II多任务调度的基础。 ARM9处理器中有专门的指令处理堆栈,可以灵活的使用堆栈。,7.3 C/OS-II在S3C2410上的移植,设置OS_CPU.H中与处理器和编译器相关的代码 用C语言编写六个操作系统相关的函数(OS_CPU_C.C) 用汇编语言编写四个与处理器相关的函数(OS_CPU.ASM),设置与处理器和编译器相关的代码,OS_CPU.H中定义了与编译器相

32、关的数据类型。比如:INT8U、INT16U等。与 ARM处理器相关的代码,使用OS_ENTER_CRITICAL() 和OS_EXIT_CRITICAL() 宏开启关闭中断设置堆栈的增长方向 :堆栈由高地址向低地址增长 #define OS_STK_GROWTH 1 (1=向下, 0=向上 ),用C语言编写六个操作系统相关的函数,void *OSTaskStkInit (void (*task)(void *pd),void *pdata, void *ptos, INT16U opt) void OSTaskCreateHook (OS_TCB *ptcb) void OSTaskDelH

33、ook (OS_TCB *ptcb)void OSTaskSwHook (void)void OSTaskStatHook (void)void OSTimeTickHook (void)后5个函数为钩子函数,可以不加代码,用汇编语言编写四个与处理器相关的函数,OSStartHighRdy()OSCtxSw()OSIntCtxSw()OSTickISR(),关于移植,相对于其他的嵌入式操作系统,uCOS-II的移植虽然是一个很简单的过程,但是,对于不熟悉uCOS-II的开发者,移植还是有一定难度的。移植工作除了要熟悉C/OS-的原理外,还要对处理器和C编译器的技术细节有一定程度的理解。,移植要

34、点,定义函数OS_ENTER_CRITICAL和OS_ENTER_CRITICAL。定义函数OS_TASK_SW执行任务切换。 定义函数OSCtxSw实现用户级上下文切换,用纯汇编实现。 定义函数OSIntCtxSw实现中断级任务切换,用纯汇编实现。 定义函数OSTickISR。 定义OSTaskStkInit来初始化任务的堆栈。,uC/OS的改进,固定的基于优先级的调度,不支持时间片,使用起来不方便。一个任务的基础上增加一个基于时间片的微型调度核在对临界资源的访问上使用关闭中断实现,没有使用CPU提供的硬件指令,例如测试并置位。系统时钟中断,没有提供用户使用定时器,可以借鉴linux的定时器

35、加以修改可以加上文件系统和TCP/IP协议栈,八、 uCOS-II操作系统实验,8.1 实验准备8.2 uC/OS-II多任务应用程序实验8.3 uC/OS-II任务间同步实验8.4 uC/OS-II任务间通讯实验8.5 uC/OS-II键盘驱动实验,8.1 实验准备硬件连接,将实验箱配套电源线连接到220V交流插座,并将其与实验箱连接。关闭实验箱电源开关(在实验箱左侧)。将实验箱配套串口线连接到计算机串口和实验箱的UART0之间将实验箱配套的并口延长线一头连接到计算机,另外一头连接到实验箱,有两种连接方式:连接到上方的并口插座(实为简易JTAG插座,USB插座边上),此时请检查其下方的SIM

36、PLE JTAG跳线,必须用跳线帽短接连接到ADT1000A仿真器,仿真器接上配套电源,并用配套的20Pin软线连接到上方的JTAG接口,此时请检查其下方的SIMPLE JTAG跳线,跳线帽必须断开,硬件连接注意事项,上述操作必须在实验箱断电状态进行,否则,容易将实验箱或者计算机的并口芯片烧坏如果SIMPLE JTAG跳线短接此时使用实验箱内部的简易JTAG接口(ARM9Simple)如果SIMPLE JTAG跳线断开此时使用外置高级仿真器(ARM9Lpt)连接正确后将实验箱上电,观察LCD,等待程序启动到如下界面(LCD显示为绿色底白色字的界面)时开始后面的操作JX2410 #,8.2 uC

37、/OS-II多任务应用程序实验,实验目的:掌握uC/OS-II下基本多任务应用程序的编写。实验内容:实现跑马灯和数码管显示的功能。实验方法:1、调用函数ARMTargetInit初始化ARM处理器; 2、调用OSInit进行操作系统初始化; 3、调用OSTaskCreate创建任务 TaskLED和TaskSEG; 4、调用ARMTargetStart函数启动时钟节拍中断; 5、调用OSStart启动系统任务调度。,实验步骤,1、创建好的模板工程Eg1,并修改相应的设置。2、新建一个文件Eg1.c,并将其添加到Eg1工程的App文件夹中。3、添加两个任务,TaskLED和TaskSEG。在Ta

38、skLED函数中每隔200个时钟节拍使所有的跑马灯闪烁一次;在TaskSEG函数中每隔100个时钟节拍切换一次数码管显示。(循环从“1”到“F”显示)4、编译工程,下载调试并运行。,实验效果,如果实验运行正确,实验箱上最右边的数码管将依次从0到F显示数据,同时四个跑马灯由亮变暗或者由暗变亮跑马灯闪烁和数码管显示分别在两个不同的任务中进行在DNW中有相应的显示,8.3 uC/OS-II任务间同步实验,实验目的:掌握uC/OS-II操作系统下使用信号量解决任务之间的同步问题。实验内容:使用信号量实现任务间同步。实验方法:1、建立两个信号量Sem1 (初始化为0,代表禁用的); Sem2 (初始化为

39、1,代表可用的); 2、通过调用OSSemPost()发送一个信号量,通过调用OSSemPend()等待一个信号量;3、约定TaskLED(TaskSEG)必须等待Sem2(Sem1)可用才能够继续往下运行,而Sem2(Sem1)在TaskSEG( TaskLED )中发送。,实验步骤,1、创建好的模板工程Eg2,并修改相应的设置。2、新建一个文件Eg2.c,并将其添加到Eg1工程的App文件夹中。3、添加两个任务TaskLED和TaskSEG。分别打印不同的字符串,并使用信号量实现打印动作的顺序执行。4、编译工程,下载调试并运行。5、添加不同的延时,观察结果;去掉信号量操作,并修改延时值,观

40、察结果。,实验效果,如果实验运行正确,实验箱上最右边的数码管将依次从0到F显示数据,同时四个跑马灯由亮变暗或者由暗变亮跑马灯闪烁和数码管显示分别在两个不同的任务中进行,并且它们之间通过邮箱进行通讯,并在超级终端中显示通讯的数据在DNW中有相应的显示,8.4 uC/OS-II任务间通讯实验,实验目的:掌握uC/OS-II操作系统下任务间通讯的方法。实验内容:使用邮箱实现任务之间的通讯。实验方法:1、通过调用OSMboxCreate()函数来创建邮箱,并指定指针的初始值。2、TaskSEG通过OSMboxPost()函数发送一个消息到邮箱中,TaskLED通过OSMboxPend()函数等待一个邮

41、箱中的消息,如果没有可用消息TaskLED就被挂起,直到邮箱中有了消息或者等待超时。,实验步骤,1、创建好的模板工程Eg3,并修改相应的设置。2、新建一个文件Eg3.c,并将其添加到Eg3工程的App文件夹中。3、添加两个任务TaskLED和TaskSEG,并创建一个邮箱Mbox1。4、在TaskSEG中申明一个int型变量nCount,设初始值为0,每隔100个时钟节拍累加一次,并向邮箱中发送nCount的值。 5、在TaskLED中申明一个int型变量nCount,接收邮箱Mbox1的值放到nCount中,并通过串口打印出来。6、编译工程,下载调试并运行。,实验效果,如果实验运行正确,实验

42、箱上最右边的数码管将依次从0到F显示数据创建了两个任务,一个显示数码管并从邮箱中接收信息,并在超级终端中显示通讯的数据;另外一个任务发送消息到邮箱在DNW中有相应的显示,8.5 uC/OS-II键盘驱动实验,实验目的:本实验的目的是在uC/OS-II下设计4X4小键盘的驱动程序。 实验内容:编写一个简单的测试程序以测试uC/OS-II下的键盘驱动程序。实验方法:1、采取定时轮询的方式对键盘状态进行扫描。2、在创建的TaskLED任务中获取键值并定义四个数字键分别控制四个LED的亮灭。,实验步骤,1、创建好的模板工程Eg_kdb,并修改相应的设置。2、新建一个文件Eg_kdb.c,并将其添加到Eg_kdb工程的App文件夹中。3、添加两个任务TaskLED和TaskSEG。4、在TaskLED调用Key_GetKey函数接收键盘输入,并处理输入。( 1 - LED1 ON/OFF ; 2 - LED2 ON/OFF ; 3 - LED3 ON/OFF ; 4 - LED4 ON/OFF )5、编译工程,下载调试并运行。,实验效果,该实验接收实验箱小键盘的输入在任务中处理了四个按键:1、2、3、4按下它们将分别对跑马灯的其中一个灯进行控制,由亮变灭,由灭变亮,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号