uCOS-II操作系统简介及实验_第1页
uCOS-II操作系统简介及实验_第2页
uCOS-II操作系统简介及实验_第3页
uCOS-II操作系统简介及实验_第4页
uCOS-II操作系统简介及实验_第5页
已阅读5页,还剩80页未读 继续免费阅读

下载本文档

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

文档简介

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、PowerPC、MIPS

2、 等众多体系结构3、可从网站上获得全部源码及其在各种体系结构平台上的移植范例。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 中断处理2.8 时钟节拍 2.9 C/OS-初

3、始化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 *pdata) do init while (1)

4、 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()或O

5、STaskCreateExt() - 就绪态等待态,就绪态,运行态 - 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; /*任务的状态字*/

7、INT8U OSTCBPrio; /*任务优先级*/INT8U 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=252.6 任务调度C/OS是抢占式实时多任务内核,优先级最高的任务一旦准备就绪,则拥有CPU的所有权开始投入运行。C/OS中不支持时间片轮转法,每

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

10、码做中断服务; 4、调用OSIntExit();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) + OSUnMapTblOSRdyTbl

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

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

13、 调用OSIntExit(); 恢复处理器寄存器的值; 执行中断返回指令;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-之前,用户至少要建立一个应用任务。 OS

14、Init(); /* 初始化uC/OS-II*/ 调用OSTaskCreate()或OSTaskCreateExt(),创建至少一个任务 ; OSStart(); /*开始多任务调度!永不返回 */OSStartif (OSRunning = FALSE) y = OSUnMapTblOSRdyGrp; x = OSUnMapTblOSRdyTbly; OSPrioHighRdy = (INT8U)(y 3;OSRdyTblprio3 |=OSMapTblprio & 0 x07;假设优先级为12 00 001 100 b (1,4)OSRdyGrp |=0 x02;(0000 0010 b)

15、OSRdyTbl1 |=0 x10; (0001 0000 b)使任务脱离就绪态将任务就绪表OSRdyTblprio3相应元素的相应位清零,而且当OSRdyTblprio3中的所有位都为零时,即全组任务中没有一个进入就绪态时,OSRdyGrp的相应位才为零。if(OSRdyTblprio3&= OSMapTblprio & 0 x07)=0)OSRdyGrp&=OSMapTblprio3;3.2 任务删除OSTaskDel() 删除任务,是说任务将返回并处于休眠状态,并不是说任务的代码被删除了 .OSTaskDel()一开始应确保用户所要删除的任务并非是空闲任务.用户可以删除statistic

16、任务 .确保用户不是在ISR例程中去试图删除一个任务 3.3 任务调度器 void OSSched (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

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

18、栈方向SPR1R2R3R4PCPSW存贮器低地址存贮器高地址高优先级任务 OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)保存当前CPU寄存器的值低优先级任务 OS_TCBOSTCBCurPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向SPR1R2R3R4PCPSW存贮器低地址存贮器高地址高优先级任务 OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)(1)(3)重新装入要运行的任务低优先级任务 OS_TCBOSTCBCurPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存贮器低地址存

19、贮器高地址高优先级任务 OS_TCBOSTCBHighRdyOSTCBCur(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

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

21、cks)的数据结构来跟踪每一个内存分区,系统中的每个内存分区都有它自己的内存控制块。 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 在启动时就会对内存管理器

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

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

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

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

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

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

28、初始值是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编译器能产生可重入代码 在程序中可以打开或者关闭中断 处理器支持中断,并且能产生定时中断(通常在1

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

30、为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中定义了与编译器相关的数据类型。比如

31、: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 OSTaskDelHook (OS_TC

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

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

34、/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插座边上),此时请检查其下方的SIMPLE JTAG跳线,必须用跳线帽短接连

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

36、C/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。在TaskLED函数中每隔200个时钟节拍使所有的跑马灯

37、闪烁一次;在TaskSEG函数中每隔100个时钟节拍切换一次数码管显示。(循环从“1”到“F”显示)4、编译工程,下载调试并运行。实验效果如果实验运行正确,实验箱上最右边的数码管将依次从0到F显示数据,同时四个跑马灯由亮变暗或者由暗变亮跑马灯闪烁和数码管显示分别在两个不同的任务中进行在DNW中有相应的显示8.3 uC/OS-II任务间同步实验实验目的:掌握uC/OS-II操作系统下使用信号量解决任务之间的同步问题。实验内容:使用信号量实现任务间同步。实验方法:1、建立两个信号量Sem1 (初始化为0,代表禁用的); Sem2 (初始化为1,代表可用的); 2、通过调用OSSemPost()发送一个信号量,通过调用OSSemPend()等待一个信号量;3、约定TaskLED(TaskSEG)必须等待Sem2(Sem1)可用才能够继续往下运行,而Sem2(Sem1)在TaskSEG( TaskLED )中发送。实验步骤1、创建好的模板工程Eg2,并修改相应的设置。2、新建一个

温馨提示

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

最新文档

评论

0/150

提交评论