嵌入式操作系统_第7章 ucOS-II - 任务的同步互斥通信
嵌入式实时操作系统uCOS-II原理

INT8U OSMemPut (OS_MEM *pmem, void *pblk); pmem :内存区域控制块的指针 pblk :将被释放的内存块的指针。
INT8U OSMemQuery(OS_MEM *pmem, OS_MEM_DATA *pdata);
消息队列(queue)
OS_EVENT *OSQCreate (void **start, INT8U size); start :消息内存区的首地址 size:消息内存区的大小;
uC/OS-II 可以运行在微控制器上的抢占式实时多任务内核。 要实现多任务机制,那么目标 CPU 必须具备一种在运行期更改 PC 的途径,否则无法做到切 换。不幸的是,直接设置 PC 指针,目前还没有哪个 CPU 支持这样的指令。但是一般 CPU 都 允许通过类似 JMP,CALL 这样的指令来间接的修改 PC。我们的多任务机制的实现也正是基 于这个出发点。事实上,我们使用 CALL 指令或者软中断指令来修改 PC,主要是软中断。但 在一些 CPU 上,并不存在软中断这样的概念,所以,我们在那些 CPU 上,使用几条 PUSH 指令加 上一条 CALL 指令来模拟一次软中断的发生。 在 uC/OS-II 里,每个任务都有一个任务控制块(Task Control Block),这是一个比较复杂的数据 结构。在任务控制快的偏移为 0 的地方,存储着一个指针,它记录了所属任务的专用堆栈地 址。事实上,在 uC/OS-II 内,每个任务都有自己的专用堆栈,彼此之间不能侵犯。这点要求程序 员在他们的程序中保证。一般的做法是把他们申明成静态数组。而且要申明成 OS_STK 类 型。当任务有了自己的堆栈,那么就可以将每一个任务堆栈当前位置,记录到前面谈到的任 务控制快偏移为 0 的地方。以后每当发生任务切换,系统必然会先进入一个中断,这一般是通 过软中断或者时钟中断实现。然后系统会先把当前任务的堆栈地址保存起来,紧接着恢复要 切换的任务的堆栈地址。由于所要切换的任务堆栈里一定也存的是地址(还记得我们前面说 过的,每当发生任务切换,系统必然会先进入一个中断,而一旦中断 CPU 就会把地址压入堆栈), 这样,就达到了修改 PC 为下一个任务的地址的目的。
ucos-II-任务通信与同步

任务的同步与一个通信初解操作系统就像就像一个好的家长,控制着资源的公平分配应用程序中的各个任务,必须通过彼此之间的有效合作,才能完成一项大规模的工作。
因为这些任务在运行时,经常需要相互无冲突地访问一个共享资源,或者需要相互支持和依赖,甚至有时候还需要互相加以必要的制约,才能保证任务的顺利进行。
因此操作系统必须具有对任务运行进行协调的能力,从而使任务之间可以无冲突,流畅的同步运行,而不致导致灾难性的后果。
这与人们依靠通信来相互沟通,从而使人际关系和谐,工作顺利的做法是一样的,计算机系统依靠任务间的良好通信来保证任务与任务的同步。
任何为任务所占用的实体都可以称为资源。
资源可以是输入输出设备,比如打印机,键盘显示器,资源也可以是一个变量,一个结构或者是一个数组。
1任务的同步和事件嵌入式系统中的各个任务是为同一个大的任务服务的子任务,他们不可避免的要共同使用一些资源,并且在处理一些需要多个任务共同协同来完成的工作时,还需要相互的支持和限制。
因此,对一个完善的多任务操作系统来说,系统必须具有完备的同步和通信机制任务的同步:为了实现各个任务之间的合作和无冲突的运行,在各个任务之间必须建立一些制约关系。
其中一种制约关系叫做直接制约关系,另一种制约关系叫做间接制约关系直接制约关系来自任务的合作:例如,有任务A和任务B两个任务,他们需要通过访问同一个数据缓冲区合作完成一项工作,任务A负责向缓冲区写入数据,任务B负责向缓冲区读取该数据。
显然,当任务A还未向缓冲区写入数据时(缓冲区为空时),任务B因不能从缓冲区得到有效地数据而应处于等待状态;只有等任务A向缓冲区写入了数据之后,才应该通知任务B去读取数据。
相反,当缓冲区的数据还未被任务B读取时(缓冲区为满时),任务A就不能向缓冲区写入新的数据而应该处于等待状态;只有当任务B自缓冲区读取数据后,才应该通知任务A写入数据。
显然,如果这两个任务不能如此协调工作,将势必造成严重的后果。
《嵌入式操作系统UCOSII原理及应用》任哲—学习笔记

第一章嵌入式实时操作系统的概念1. 计算机操作系统:对计算机系统资源进行管理,并向计算机用户提供若干服务。
OR:计算机操作系统是计算机硬件的一个软件包装,它为应用程序设计人员提供了一个更便于使用的虚拟计算机。
2. 操作系统功能:1)处理器的管理:(1) 中断管理;(2)对处理器工作进行调度;2)存储的管理:3)设备的管理:4)文件的管理:5)网络和通信的管理:6)提供用户接口:3. 嵌入式系统:对对象进行自动化控制而使其具有智能化并可嵌入对象体系中的专用计算机系统。
4. 嵌入式操作系统:运行在嵌入式硬件平台上,对整个系统及其所操作的部件、装置等资源进行统一协调、指挥和控制的系统软件。
5. 实时操作系统:(1)多任务系统;(2)任务切换时间与系统中的任务数无关;(3)中断延时的时间可预知并尽可能短。
第二章uC/OS-II中的任务1. uC/OS-II操作系统内核的主要工作就是对任务进行管理和调度。
2. UC/OS-II的任务组成部分:(1)任务程序代码:任务的执行部分;(2)任务堆栈:保存任务工作环境;(3)任务控制块:保存任务属性。
3. uC/OS-II的两种任务:用户任务:由应用程序设计者编写的任务。
系统任务:系统提供的任务。
4. 任务的状态:(1)睡眠状态:是否配置或剥夺任务控制块的配置情况;(2)就绪状态:任务就绪表进行就绪登记,等待优先级,具备运行充分条件;(3)运行状态:获得CPU使用权限,任何时候只有一个任务处于运行状态。
(4)等待状态:正在运行的任务,需要等待一段时间或一件事件发生在运行,暂时交出CPU使用权。
5. 用户任务代码结构:任务的执行代码通常是一个无限循环结构,并且在这个循环中可以响应中断,这种结构叫做超循环结构。
6. OSTaskCreate()用来创建任务的函数;OSStart()用来启动各项任务的函数,启动后,任务就交由操作系统来管理和调度了。
7. uC/OS-II预定义了两个为应用程序服务的系统任务:空闲任务:每个应用程都必须使用的,是CPU处于空闲时有事可做,也可在其中添加用户工作代码;统计任务:根据实际需要进行选择使用。
4、uCOS-II-任务同步与通信-2

Rx
Tx
UART
M_Dev
Rx
Tx
UART
S_Dev1
Rx
Tx
UART
S_Dev2
2020/8/23
page 7
void main(void) //系统主函数 { OSInit();
void Task_A(void * pdata) { ......; //Task_A环境初始化
for (;;) { ......; // Task_A 业务 OSTaskCreate(UART_S1_Task,(void *)US1,......); ......; // Task_A 业务 OSTimeDly( xxx ); } }
常用的事件:信号量(计数型---SEM/互斥型--MUTEX)、消息邮箱(MBOX)、消息队列(Q)、事件标 志组等。
2020/8/23 事件用 “事件控制块”(ECB) 来描述。
page 1
目录
1、 任务间的同步和事件控制块 2、 信号量及其操作 3、互斥型信号量和任务优先级反转 4、消息邮箱及其操作 5、消息队列及其操作
Task_A
Task_B
Task_A would print
Prtinter
Task_B would print
备注:数据采集任务A 和数据处理任务B 之间存在互斥关系。
2020/8/23
page 5
1 任务间的同步和事件控制块
任务之间的这种相互制约、相互合作的运行机 制称为 “任务间的同步”
嵌入式实时操作系统uCOSII第7章__内存管理

return ((void *)0);
}
}
值得注意的是,用户可以在中断服务子程序中调用 OSMemGet(),因为在暂时没有内存块可用的 情况下,OSMemGet()不会等待,而是马上返回 NULL 指针。
释放一个内存块,OSMemPut()
当用户应用程序不再使用一个内存块时,必须及时地把它释放并放回到相应的内存分区中。这 个操作由 OSMemPut()函数完成。必须注意的是,OSMemPut()并不知道一个内存块是属于哪个内 存分区的。例如,用户任务从一个包含 32 字节内存块的分区中分配了一个内存块,用完后, 把它返还给了一个包含 120 字节内存块的内存分区。当用户应用程序下一次申请 120 字节分区 中的一个内存块时,它会只得到 32 字节的可用空间,其它 88 字节属于其它的任务,这就有可 能使系统崩溃。 程序清单 L7.5 是 OSMemPut()函数的源代码。它的第一个参数 pmem 是指向内存控制块的指 针,也即内存块属于的内存分区[L7.5(1)]。OSMemPut()首先检查内存分区是否已满 [L7.5(2)]。如果已满,说明系统在分配和释放内存时出现了错误。如果未满,要释放的内存
第 7 章 内存管理...................................................... 1 7.0 内存控制块 .................................................... 2 7.1 建立一个内存分区,OSMEMCREATE() ................................. 3 7.2 分配一个内存块,OSMEMGET() ..................................... 5 7.3 释放一个内存块,OSMEMPUT() ..................................... 6 7.4 查询一个内存分区的状态,OSMEMQUERY()............................ 7 7.5 USING MEMORY PARTITIONS ........................................... 8 7.6 等待一个内存块 ............................................... 10
嵌入式操作系统uCOS2复习指南

复习:第一章:实时操作系统、操作系统基本功能、任务、多任务、任务状态及相互关系、任务切换、可重入和不可重入;可剥夺和不可剥夺内核;同步与通信:同步、互斥、临界区、事件、信号量、互斥信号量、消息邮箱、消息队列;中断、时钟、内存管理。
第二章:任务管理:任务控制块TCB数据结构及各数据项意义任务控制块实体任务控制块空闲链表、就绪链表优先级指针表任务堆栈任务就绪表及就绪组及相关代码图2.16:任务状态转换图,要弄清楚任务各状态及转换条件程序2.6,2.7,2.8和2.9,获取就绪任务中的最高优先级,能给出OsRdyGrp和OsRdyTbl后,依据程序,算出最高优先级;并且说明处理时间是恒定的程序2.10、2.11、2.14、2.15、2.17、2.27、2.28、2.29、2.30、2.34分析第三章中断和时间管理中断处理流程,图3.1时钟中断服务,程序3.2,OSTIMETICK(程序2.27)任务延迟函数OSTIMEDLY作用及代码分析(程序3.4)第4章ECB数据结构事件等待组、等待表作用,与就绪组合就绪表有何联系和不同事件控制块空闲链表及ECB初始化函数(程序4.3)事件等待函数(程序4.5)将等待事件就绪(程序4.8)信号管理:OSSEMCREAT、OSSEMDEL、OSSEMPEND、OSSEMPOST4.3.9:信号量应用举例互斥信号管理:OSMutexCreat、OSMutexDEL、OSMutexPEND、OSMUtexPOST优先级反转解决优先级反转采用何种策略4.4.8:互斥信号量应用举例第5章5.1 消息邮箱:OSMBOXCREAT、DEL、PEND、POST5.1.8 例子5.2消息队列:Os_QInit,OsQCreat;POST;PEND消息队列数据结构:图5.8到5.115.2.8 例子第6章内存管理内存控制块数据结构MCB链表Os_MemInit();OsMemCreat();OsMemGet();OsMemPut()设内存区有6个块构成,依次画出4个图:内存块创建后、分配一个块后、再分配两个块后、释放第一次分配的块后的结构图。
实验2 uCOS-II任务间通讯和同步实验

嵌入式实时操作系统实验报告1实验名称:uC/OS-II任务间通讯和同步实验姓名:班级:信科10-4班学号:uC/OS-II任务间通讯和同步实验一、实验目的1、掌握uC/OS-II操作系统下使用信号量解决任务之间的同步问题;2、掌握uC/OS-II操作系统下任务间通讯的方法。
二、实验内容1、使用信号量实现任务间同步(Eg2工程)2、使用邮箱实现任务之间的通讯(Eg3工程)三、基础知识uC/OS-II任务之间的通讯与同步方式1、利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来关闭中断和打开中断2、利用函数OSSchedLock()和OSSchekUnlock()对µC/OS-II中的任务调度函数上锁和开锁3、信号量4、邮箱5、队列uC/OS-II中使用信号量进行任务之间同步1、通过调用OSSemCreate()建立信号量2、通过调用OSSemPost()函数发送一个信号量3、通过调用OSSemPend()函数等待一个信号量OSSemCreate1、Sem1 = OSSemCreate(0);2、参数为信号量的初始计数值赋值。
该初始值为0到65,535之间的一个数。
3、如果信号量是用来表示一个或者多个事件的发生,那么该信号量的初始值应设为0。
4、如果信号量是用于对共享资源的访问,那么该信号量的初始值应设为1(例如,把它当作二值信号量使用)。
5、如果该信号量是用来表示允许任务访问n个相同的资源,那么该初始值显然应该是n,并把该信号量作为一个可计数的信号量使用。
OSSemPost和OSSemPend1、如果信号量当前是可用的(信号量的计数值大于0),将信号量的计数值减1,然后函数将“无错”错误代码返回给它的调用函数。
如果信号量的计数值为0,而OSSemPend()函数又不是由中断服务子程序调用的,则调用OSSemPend()函数的任务要进入睡眠状态,等待另一个任务(或者中断服务子程序)发出该信号量。
嵌入式实时操作系统题库1

嵌入式实时操作系统题库一、填空题1.uC/OS-II是一个简洁、易用的基于优先级的嵌入式(抢占式)多任务实时内核。
2.任务是一个无返回的无穷循环。
uc/os-ii总是运行进入就绪状态的(最高优先级)的任务。
3.因为uc/os-ii总是运行进入就绪状态的最高优先级的任务。
所以,确定哪个任务优先级最高,下面该哪个任务运行,这个工作就是由(调度器(scheduler))来完成的。
4.(任务级)的调度是由函数OSSched()完成的,而(中断级)的调度是由函数OSIntExt() 完成。
对于OSSched(),它内部调用的是(OS_TASK_SW())完成实际的调度;OSIntExt()内部调用的是(OSCtxSw())实现调度。
5.任务切换其实很简单,由如下2步完成:(1)将被挂起任务的处理器寄存器推入自己的(任务堆栈)。
(2)然后将进入就绪状态的最高优先级的任务的寄存器值从堆栈中恢复到(寄存器)中。
6.任务的5种状态。
(睡眠态(task dormat)):任务驻留于程序空间(rom或ram)中,暂时没交给ucos-ii处理。
(就绪态(task ready)):任务一旦建立,这个任务就进入了就绪态。
(运行态(task running)):调用OSStart()可以启动多任务。
OSStart()函数只能调用一次,一旦调用,系统将运行进入就绪态并且优先级最高的任务。
(等待状态(task waiting)):正在运行的任务,通过延迟函数或pend(挂起)相关函数后,将进入等待状态。
(中断状态(ISR running)):正在运行的任务是可以被中断的,除非该任务将中断关闭或者ucos-ii将中断关闭。
7.(不可剥夺型)内核要求每个任务自我放弃CPU的所有权。
不可剥夺型调度法也称作合作型多任务,各个任务彼此合作共享一个CPU。
8.当系统响应时间很重要时,要使用(可剥夺型)内核。
最高优先级的任务一旦就绪,总能得到CPU的控制权。
嵌入式系统开发--同步、互斥与通信

嵌入式系统开发同步、互斥与通信嵌入式系统开发中,同步、互斥与通信是三个重要的概念。
它们在系统设计和实现中起着至关重要的作用,确保系统能够高效、稳定地运行。
本文将详细介绍这三个概念,并提供一些实用的编程技巧。
同步是指在多个并发执行的任务或线程之间建立一种时间上的关系,确保它们按照一定的顺序执行。
在嵌入式系统中,同步机制可以帮助我们避免竞态条件、死锁等问题,保证系统的正确性和可靠性。
常用的同步机制包括信号量、互斥锁、条件变量等。
互斥是指在多任务环境下,确保同一时间只有一个任务能够访问共享资源。
互斥机制可以防止多个任务同时修改同一数据,从而避免数据不一致和竞争条件。
常用的互斥机制包括互斥锁、读写锁等。
通信是指在不同任务或线程之间进行数据交换和消息传递。
在嵌入式系统中,通信机制可以帮助我们实现任务之间的协作和资源共享,提高系统的效率和响应速度。
常用的通信机制包括消息队列、共享内存、管道等。
在嵌入式系统开发中,合理地使用同步、互斥和通信机制,可以有效地提高系统的性能和稳定性。
然而,不当的使用也可能导致系统出现死锁、资源竞争等问题。
因此,在进行系统设计和编程时,我们需要仔细分析任务之间的关系,选择合适的同步、互斥和通信机制,并进行严格的测试和验证。
在下一部分,我们将详细讨论如何使用这些机制进行嵌入式系统开发。
我们将通过一些具体的例子,展示如何利用信号量、互斥锁、条件变量等实现任务同步,如何利用互斥锁、读写锁等实现任务互斥,以及如何利用消息队列、共享内存、管道等进行任务通信。
同时,我们还将探讨一些常见的同步、互斥和通信问题,并提供一些解决方案和最佳实践。
嵌入式系统开发同步、互斥与通信嵌入式系统开发中,同步、互斥与通信是三个重要的概念。
它们在系统设计和实现中起着至关重要的作用,确保系统能够高效、稳定地运行。
本文将详细介绍这三个概念,并提供一些实用的编程技巧。
同步是指在多个并发执行的任务或线程之间建立一种时间上的关系,确保它们按照一定的顺序执行。
4、uCOS-II-任务同步与通信-1

禁止,然后允许任务切换 :利用μC/OS_Ⅱ 函数调用
Entry section (进入区)
Critical section (临界区)
Exit section (退出区)
Remainder section (剩余区)
Until false
2020/8/23
OSSchedLock();
if (OSRunning == TRUE) { /* Make sure multitasking is running */ OS_ENTER_CRITICAL(); if (OSLockNesting < 255) { /* Prevent OSLockNesting from wrapping
互斥信号量状态图
释放(递归) 锁定数减1
page 21
互斥信号量
所有权:当一个任务通过获取互斥信号量 而将其锁定时,得到该互斥信号量的所有 权。相反,当一个任务释放信号量时,失 去对其的所有权。
当一个任务拥有互斥信号量时,其他的任 务不能再锁定或释放它,即任务要释放互 斥信号量,必须事前先获取该信号量。
这通常称作测试并置位(Test-And-Set),或称作TAS。 TAS操作可能是微处理器的单独一条不会被中断的 指令,或者是在程序中关中断做TAS操作再开中断。
有的微处理器有硬件的TAS指令(如Motorola 68000系列,就 有这条指令)
2020/8/23
page 14
访问临界资源
Repeat
当运行到P1:request(D2)时,P1占用D1,但D2已经被P2占用, P1阻塞; 当运行到P2:request(D1)时,也将因为D1已被P1占用而阻塞, 产生死锁(条件: P1:request(D1), P2:request(D2))。 死锁:多个任务在运行过程中因争夺资源而造成的一种僵局。 原因:竞争资源引起;任务间推进顺序非法。
第7章 实时操作系统uCOS-Ⅱ

OSTCBPrev
OSTCBPrev
OSTCBPrev
OSTCBPrev
OSTCBPrev
图7-1 空任务列表
14
本节提要
C/OS-Ⅱ简介 2 C/OS-Ⅱ内核结构 3 4 5 6 7 C/OS-Ⅱ任务管理
1
C/OS-Ⅱ任务通信与同步 C/OS-Ⅱ中断与时间管理
C/OS-Ⅱ应用程序举例
4
C/OS的性能特点(二)
占先式(Preemptive) 多任务 C/OS-II可以管理64个任务,然而,目前这一版本保留8个给系 统。应用程序最多可以有56个任务 可确定性 全部 C/OS-II的函数调用与服务的执行时间具有可确定性 任务栈 每个任务有自己单独的栈, C/OS-II允许每个任务有不同的栈 空间,以便压低应用程序对RAM的需求。 系统服务 C/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、 块大小固定的内存的申请与释放、时间相关函数等。 中断管理 中断可以使正在执行的任务暂时挂起,如果优先级更高的任务 被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执 行,中断嵌套层数可达255层。 稳定性与可靠性
19
2.任务创建与删除
创建任务函数利用函数的调用参数为任务分配和初始化相 关的数据结构。首先初始化一个任务控制块,并通过任务控制 块把任务代码和任务堆栈关联起来形成一个完整的任务。 (1)任务创建 µC/OS-Ⅱ通过OSTaskCreate() 或 OSTaskCreateExt()来 建立任务。函数OSTaskCreate()的声明为:
11
Alternate Structure
void YourTask (void *pdata)
嵌入式实时操作系统-------任务同步与通信

23
互斥信号量系统函数
• 创建OSMutexCreate()
OSEvent OSMutexCreate(INT8U prio, INT8U *err)
• 请求互斥信号量OSMutexPend()和 OSMutexAccept()
void OSMutexPend(OSEvent *pevent, INT16U timeout, INT8U *err)
14
4.1.5空事件控制块链表
• 事件控制块的总数由用户所需要的信号量、邮箱和消息队列的 总数决定。 • 该值由OS_CFG.H 中的#define OS_MAX_EVENTS定义 • 在调用OSInit()时,所有事件控制块被链接成一个单向链表—— 空闲事件控制块链表 。每当建立一个信号量、邮箱或者消息队
25
邮箱的操作
• 创建邮箱 OSMboxCreate() OSMboxPost()和OSMboxPostOpt()
OSEvent OSMboxCreate(void *msg)
• 向邮箱发消息
INT8U OSMboxPost(OS_Event *pevent, void *msg) INT8U OSMboxPost(OS_Event *pevent, void *msg, INT8U opt)
• 从等待任务列表中删除一个任务
if ((pevent->OSEventTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07]) == 0) { pevent->OSEventGrp &= ~OSMapTbl[prio >> 3];
}
• 在等待任务表中查找最高优先级任务
ucosII任务间通信详解

ucos II 任务间通信详解ucos II 任务间通信之一 :全局变量任务创建好了之后,只是完成了系统编程的一小步,更为重要的是任务间的通信。
比如在mcu21的项目里,有通信任务,有液晶显示任务,有控制任务。
控制任务需要用到通信任务接受到的数据,液晶显示任务也显示控制任务的数据。
这就需要用到任务间的通信了。
Mcu21总结了一下,在ucos II 里任务间通信可以采用以下几种方式。
z共享全局变量,这是最快捷有效的方式,实现这种通信可以采用以下两种方式:一是利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来关闭中断和打开中断,二是利用函数OSSchedLock()和OSSchedUnlock()对μC/OS‐II中的任务调度函数上锁和开锁.z使用信号量z使用邮箱z使用消息队列下面介绍下共享全局变量的实现过程。
(1)宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()是在移植ucos II过程中由用户定义的。
在os_cpu.h这个文件中。
代码如下,这部分代码的作用是关,开中断,具体和CPU有关。
当我们调用OS_ENTER_CRITICAL()时,系统中断被关闭,我们知道,任务切换时基于定时器中断的,当系统中断别关闭时,其它中断,包括定时器中断也就被关闭,任务切换也不可能发生,所以确保在访问变量的时候,不会有其它的任务或中断也在同时访问这个变量。
这两个宏非常好用,在mcu21的项目里经常用到。
尤其在中断处理函数里面。
因为现在的很多CPU是支持中断嵌套的,为了防止中断执行的时候不被其它的中断打断,就可以调用这两个宏。
(2)第二种方法是给任务调度函数上锁,开锁。
这种方法和使用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()最大的区别是:中断是可以执行的。
尽管不执行任务切换,变量依然有可以被中断函数访问。
给任务调度器上锁的函数如下void OSSchedLock (void){if (OSRunning == TRUE) {OS_ENTER_CRITICAL();OSLockNesting++;OS_EXIT_CRITICAL();}}给任务调度器解锁的函数如下void OSSchedUnlock (void){if (OSRunning == TRUE) {OS_ENTER_CRITICAL();if (OSLockNesting > 0) {OSLockNesting‐‐;if ((OSLockNesting | OSIntNesting) == 0) { (1)OS_EXIT_CRITICAL();OSSched(); (2)} else {OS_EXIT_CRITICAL();}} else {OS_EXIT_CRITICAL();}}}它实现的原理大致是这样的。
uCOS-II嵌入式实时操作系统原理与移植

1,决定是否进行上下文切换 2,保存当前执行进程的上下文
包括程序计数器PC、通用寄存器、 与任务有关的数组、表格、链等。
uC/OS-II采用可
剥夺实时内核,
含义是最高优先
0
级任务一旦就绪,
总能得到CPU使
1
用权。
系统保留4个
2
最高优先级
3
4
5
执行该任务
6
7
……
uC/OS-II 的中断(ISR)
任务2—TCB--就绪—任务堆栈
任务3--TCB--等待—任务堆栈
任务4--TCB --睡眠—任务堆栈
uC/OS-II的任务之间通信
任务之间共享的信息成为事件,同一时刻只能有一个任务使 用共享信息,因此为每个事件构建一个事件控制块ECB来保 证任务之间安全共享信息。事件控制块总数由OS_CFG.H中的 OS_MAX_EVENTS定义。事件包括信号量、邮箱、消息队列。
内存组配置文件 储存器映射MMU初始化与操作 Nand flash控制器初始化与操作
与CPU相关的配置选项 开机画面BMP文件 开机画面BMP文件 开机画面BMP文件 初始化mini2440目标板 定义任务优先级、堆栈大小及函数原型声明 初始化操作系统定时器0 开机画面BMP文件
关于信号量和等待的API功能函数
//任务循环
{
OSPrintf("\nEnter Main Task\n");
OSTimeDly(OS_TICKS_PER_SEC); //将任务延迟一段时间,进入等待态
}
}
uC/OS-II的任务都运行在无限循环中。
欢迎访问机电技术博客:/spurtltl@126/
嵌入式实时操作系统uCOS-II原理(课件PPT) μCOS-II中的任务管理

1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 3
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 4
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0
5 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0
或
prio=29 0 0 0 1 1 1 0 1
y = OSUnM图5a-6p在T就bl绪[O表S中R查d找yG最高rp优];先级别任务的过程 prio = (INT8U)((y << 3)
任当务控应制用块结程构序的主调要用成员函数OSTaskCreate( )
任务及控任制务块控(O制S_块TC链B)表 t…y创统进任务控这表…pOssIII数具链的表…ettNNNrrd…S建函行务控制个的TTTuue任_会有接任。fcc188Stts任 任 制 认6UU务T一数初从制块任头μ栈务理控tooUr当由按相为务即Kuss控__c个始空块各务部O务务块和ttt制*C指有的制cc进于用应一,相oSObbOOOs/块任化任,个控T_S**SSS控的的管行这户数个故当tT优针关O块OOC链TTTcbCSS务。务然成制BCCCS表系 些提量链这于BTT{BBBI制 身 任理先、 的-SCCDSP时这控后员块ntIBBtr统任供的表个是kliayi块 份 务的NPPot级任 属I;,个制用进链t;r;te初务的任。链一re用x///;vt///就 证 是这函块任行入(任任任/;;别务 性//始控任务表些指///指务务务来指个数链务赋到)向相 , 不等的 的向化制务控叫空等的的向来任记函首表的值任后待当优前时块数制做白当 没 能务为一当 表一的前先一空数先获属,务堆录个,还为块空的时状级个任任于 有 被栈些前 就会为取性最控任限态别任务初没系并任身任栈务务标(务是 任 系控与状 叫调 被 一 对后 制顶控始有统 把务份志节控控制务的用创个任再块制拍一务统制任态做块化对创它块证指制块数块的链系建任务把链针个控承的函应建们链。)务任、的块表指堆指管任务针针
嵌入式实时操作系统ucosii

医疗电子
ucosii在医疗电子领域 中应用于医疗设备、监
护仪、分析仪等。
物联网
ucosii在物联网领域中 应用于传感器节点、网
关、路由器等设备。
02
ucosii的体系结构与内核
任务管理
任务创建
ucosii提供了创建新任务的函数,如 OSTaskCreate(),用于创建新任务。
任务删除
ucosii提供了删除任务的函数,如 OSTaskDelete(),用于删除不再需要的任 务。
时间管理
01
02
03
时间节拍
ucosii通过定时器产生固 定时间间隔的节拍信号, 用于任务调度和时间管理 。
超时处理
ucosii支持超时机制,当 某个任务等待时间超过预 定阈值时触发相应的处理 函数。
时间函数
ucosii提供了一系列时间 函数,如OSTimeDly()、 OSTimeTick()等,用于时 间相关的操作和控制。
智能家居
ucosii适用于智能家居领域,可应用于 智能家电控制、家庭安全监控等场景。
02
03
医疗电子
ucosii适用于医疗电子领域,如医疗设 备控制、病人监控等,其可靠性和实 时性为医疗系统提供了有力保障。
THANKS。
应用软件的开发
任务管理
在UCOSII中,任务是用来实现应用程序功能的。在进行应用软件的开发时,需要创建和管理任务。这包括任务的创 建、删除、挂起和恢复等操作。
任务间通信
为了实现任务间的协同工作,需要进行任务间通信。UCOSII提供了信号量、消息队列、互斥量等机制来实现任务间 通信。在进行应用软件的开发时,需要利用这些机制来实现任务间的同步和数据交换。
嵌入式实时操作系统uC OS-2教程(吴永忠)章 (7)

/*确保ECB类型正确
*/
*err = OS_ERR_EVENT_TYPE;
/*若不正确,则返回错误代码和指针
*/
return (pevent);
}
OS_ENTER_CRITICAL();
if (pevent->OSEventGrp != 0x00) {
/*检查是否有任务在等待信号量
*/
第7章 信号量与互斥信号量
OS_EVENT *OSSemCreate (INT16U cnt)
{
#if OS_CRITICAL_METHOD ==3
OS_CPU_SR cpu_sr;
#endif
OS_EVENT *pevent;
义一个事件控制块指针
*/
if(OSIntNesting > 0){
保中断服务子程序不能调用该函数 */
指针,供其它信号量函数进行操作 */
}
第7章 信号量与互斥信号量 图7.2 OSSemCreate()函数返回之前的ECB数据结构
第7章 信号量与互斥信号量
3. 范例
OSSemCreate()函数使用范例如下:
OS_EVENT *AdcSem;
量ECB的指针
*/
/*定义一个指向信号
void main(void) { OSInit(); . AdcSem=OSSemCreate(1);
第7章 信号量与互斥信号量
③ OS_ERR_INVALID_OPT:参数opt不是两种合法参数之 一。
④ OS_ERR_TASK_WAITING:有任务在等待信号量。 ⑤ OS_ERR_PEVENT_TYPE:pevent不是指向信号量的指针。 ⑥ OS_ERR_PEVENT_NULL:无可用的OS_EVENT事件控制块。 2. 返回值 如果信号量删除成功,则返回空指针;若信号量没有能被 删除,则返回pevent,这时应该检查出错代码,以查明原因。
嵌入式实时操作系统uCOS II【精选】

予任 境处的务控存理制储器块位的提置堆供。了栈运指行针环SP } OS另指控…_ITN外针制…CTB8再(块;U S用,P一它)个除,数了这据保个OS结存数TC构任据BP保务结ri存堆构o;任栈叫务指做//堆针任任栈之务务的优任作一先任务系个级务控统数别堆制另据栈块行结是构构由造,操的每
外还要负责保存任务其他信息。
处理器中的运行环境和内存中的运行环境处理器内存任务代码pc寄存器组sp处理器通过两个指针寄存sp来与任务程序运行环境代码和任务堆栈建立联系并运行它任务堆栈多任务时的问题处理器pc寄存器组sp当有多个任务时处理内存内存器中的运行环境应该怎内存任务代码任务代码任务代码任务堆栈任务堆栈任务堆栈程序运行环境多任务时任务与处理器之间关系的处理在内存中为每个任处理器pc寄存器组调度器复制pcpcpcpc务创建一个虚拟的处理器处理器部分的运行环境sp复制寄存器组spsp复制spsp也就是说任务的切换是虚拟虚拟虚拟处理器虚拟当需要中止当前任处理器处理器当需要运行某个任务时任务运行环境的切换处理器再把另一个需要运行的任就把该任务的虚拟处理务的虚拟处理器复制到实由操作系统的调度应的虚拟处理器复器复制到实际处理器中制到内存际处理器中器按某种规则来进行这两个复制工作程序程序虚拟处理器要建立一个概念
行这两个复制工作
虚要拟建处立理一器个概念:具有
控制块的程序才是一个 虚拟处理器应该存储的主要信息:
任务控1制。块程结序构的的断主点要地成址员(PC)
任务内控存制块
可以被系统所运行的任务。 2。任务堆栈指针(SP)
typede3f。s程tr序uc状t态os字_t寄cb存{器(PSW)
这些内容通常保 存任在务任代务码堆栈中,
分的运行环境 程程序序
SP
复复制制
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
IO)N;SO当就T_函8SE任绪USV数e务状EmON等P态S的TeS待n。e*返dmp的允如ePv回o时许果esnt间用值t参(/超参数/为信过数ti号已mttii量emmo创eeu的ootu被u建指tt时设设针的可置置信以一为结个0号,束等量则等待表的待时明状间指任态的针务而限。的进制入,等
待时间为无限长。 调用函数成功后,函数返回值为OS_ON_ERR,否则会根据具体 错误返回OS_ERR_EVENT_TYPE、OS_SEM_OVF。
函块以8 位IO)表数,N;至函vOS赋o明TO把S_占数i8低号号优_EdS这以U成EMVO用O8 先为值V是ESu员pOS这ENtMre无位级(M一SiNOTxo个uMTuCS个t效和(反该*te资uEre*pxet互xvpee)高转值Pa欲源Pevxete斥enevePn的,8现为(提ntneodT型dnts()y其t高位象0t从升,)p/信(/x的e他(/互/空8两而F赋互的号原任F斥事位部要斥以量时优型务型件型常用分提,为,先释信控信数然:来:升放信号级制号后O了存低的量号别S块量再该指_放8优为链指E)把信针V为位先有针表成,E号N了用级获效员量低T取避来别O_,。8TS一免存pY否位ErPv个i出放则oeE赋n。事_t现信M信C以件nUt常控的TE制数高X
型会的信使反号高转量级现。别象的做任一务个处详于细等的待分状析态,,以而期那些不 使找用出该原信因号及量解的决中方等法级。别的任务却可以剥夺 低优先级别的任务的CPU使用权而先于高优 先级别的任务而运行了。
创 建 互 斥 型 信 号 量 需 要 调 用 函 数 OSMutexCreate( ) 。 函 数
互 任斥务型优信先号级量反和转 解务升以能然来图情务务而只源通能号优任而如的到尽后决使的在式任象在优况用能进4BA-,和过够先务果量系优所快在问该优1可使务一先,。于允行5任任例运级与低两统先有地释题任先描剥用先般级这其保许访务务子行别高优个中级任使放的务级述夺共于情反种中护一问BC可是的优先条还别务用了办不别了型享高况转现,该个,的都以 受 约 先 级件存在 最 完 信法 被。A内 资 优下现象任 资 任 即优要、发 任 束 级 别约 有使 高 共 号之 其核 源 先是 象叫务 源 务 这先使B现 务 。 别 的束 别用 优 享 量一 他中 时 级不 的做A的 以 个、级用的, 于 的 任的 的共 先 资 之, 的, , 任任允 ,信 独 信C别同优使 是 任 务, 中享 级 源 后是 任三当 会 务务许 下号 占 号高一先用 当 务 先而 等资 的 并 再使 务个任 出 而优出 面的量 量于个级信 出 使 获信 优源 高用 得号 先期 一 放 复得 打务以 低 运级这对式同 一务享高量和低同了量级间个信该信 断的独优行反种优对一 个C资于的是优一信的别暂级号任号,运占先的转任先。该时互源任任否先个号约的时别量务量从行方级现务级。任资间斥S务占级信量束任提上,原任而,是用别号,高务,否信的量就于时,,
函数OS_EventTaskRdy ( )将在任务调用函数OS×××Post ( ) 发 送一个事件时,被函数OS×××Post ( )所调用。
在μC/OS-II初始化时,系统会在初始化函数 OSInit( )中按应用程序使用事件的总数 OS_MAX_EVENTS(在文件OS_CFG.H中定义), 创建OS_MAX_EVENTS个空事件控制块并借用
空事件控制块链表 成员OSEventPtr作为链接指针,把这些空事件控
制块链接成一个单向链表。由于链表中的所有控 制块尚未与具体事件相关联,故该链表叫做空事 件控制块链表。以后,每当应用程序创建一个事 件时,系统就会从链表中取出一个空事件控制块, 并对它进行初始化以描述该事件。而当应用程序 删除一个事件时,就会将该事件的控制块归还给 空事件控制块链表
信号量及其操作 任 号 O首 号 去 函 应 OOOII)NN;SSSS任OvI参为量运数务量先TT用S__SN在OOOI)oI88SEEeNei数计行O防T获要,;SSSNUU务程SmdmVVT8SSS_T使e数等p止DP得检EE释o*1UmOS序通1eeEeoep6NNeevS器待任PrsmmV6信查*放t用Ulmr,如TTe(t过SeeUCCEn任O(务nPr)et号是信*tir来rrN信果*dmo)是m调S)p。务因O(;sceeT量否号EeP删et不)被vSnaa号e用voO的中(得e还,量Sneu除ttt)请Sn需dnet的原优不函ee*t,量S有也并mt该,(C求((Oe要原型先/到DOm数n/等叫在信S信之信teS某型如级/P加信)Sl/待做访O号_)o等号号e的(前E为下别个一s号S该发问量mtV待量来量S::(最//;量C原信eE,//信送共,时的删错)的mrN函高/如而号/这创e型 /号信享P限错指除误T应指数的e果处a/量个*n量号资针条信误针t为信在pd用任有于建函ee(了的量源件息信。对v务,长:号程e数)任结,选息,(n信一请。则期t的量项务束发,序那号调的求原送以。个计么量/必用等/信型信信后如的可调数待须为号信号号果,计以度状:器量量量没必调数器调态号的需有须初,器O用,用指S调要,操函量值函_函函针用释就S作数数c数数,h函放把之ed数信前信( ,)
事件控制块 t{}然 OIOvI)数 OvO)函 一yNN;o;OvO)函OOSSIIvIIopSS后iTTNNNN;o。数个i__doeS__dSSS88iEEdTTTT据邮块关_引EE*di数UU事OvVe××_dE8188mOvVf*eS发U6UUEEemVS件箱中结事snOEOOsU_ngN×O×_ttEVsN一OEtTSSr,时OOkESTTONu)包构件va_ETSSEvO次SS×_×secE,TS*vEe_k*ntEEN(Evpen;来和含的R任vptE被vv)enetTPPveev函TTdnveetvnOv务eeyePnntOee函描消包数neTt数e(nn*ntttnT(n调taTGrtn()数Cdpdt,stb);函的述息括据y将tTrk度/nl(e(pTO/p[R事数a原tOve)在;a;诸队 等S。ds;所eS×ys件的型)k任n_k如(列 待WE×控原为t调W务///V/请///a×/消制未清型:信这 任/事调aE用/i事itPN块使除息为件用t号些 务求eT。(n(的用T:或件控O_/dC/量事 表T(指等S消)制B一,B)控×所状针待息件 在、L块×将_调制态事队个的S邮。 内//×//用I标事信件列在块指ZP箱事的。志事E件号的的e针任的n]掩;的量任指d(件所/(/件任务指码类计务针)消控有务请型数组针调时息制有等求器用待,表函数被
嵌入式实时操作系统
μC/OS-II
信息学院
主要内容
1.操作系统中常用的数据结构 2. μC/OS-II的任务管理(任务调度) 3. μC/OS-II的中断和时钟 4. μC/OS-II的任务的同步与通信 5. μC/OS-II的存储管理
系例统如中,的两多个个任任务在:运任行务时A和,任经务常需B,要它互们相
OS_IMNTU1T6EUXt_imAVeoAuItL, ABLE ( 该//常等待数时值限为 0xFFFF ) 的 低 8 位 (0IxNFTF)8U以*e表rr明信号量尚未被任//错何误任信务息所占用,处于有效状态。
);
创数任息的建务,原邮如这可型箱个以果为函通需把数过:要数的调调据原用用缓型函函冲为数数:O区SOM的Sb指Mox针Pboos赋xtC(给r)e向a一t消e个息(事邮),件箱这发送个消函
OSMut在ex描Cre述ate互( )斥的原型型信如号下量:的事件控制块中,除了
互斥型信号量 OII)NN;S任号TT_当数量则运88E务量UUV,任意行O成O互O可,Ep*S如SS务味并reNM斥员i以这rE_orT果需着对u,Ev通个型OteeV信*要目该Sxn//过函O信//EP号E优错t访前资SPe调数NvM号n量t先误问尚源eTrd用的u之n(有量级信_t一 无进te函原TT)x外信别息来和个任行YyC数型p号r,请P独务访仍eO为eEa(要S求成占占问t:然_eMOM赋管式用,员u没StUE理共资否以eO有xvT这P享源则eS(常Eno使Et个资就,sXC数vt(用n以e资源进于)tn发的成源时表入是tC送低的员等任,n明一8t被互待务就位这个斥为状可要分是互0型态以调成斥x一F信继用,了型F个号续函直)信,
务的同步的。
任务间的同步依赖于任务间的通信。 在μC/OS-II中,是使用信号量、邮 箱(消息邮箱)和消息队列这些被
事件 称作事件的中间环节来实现任务之
间的通信的。
黄宏
宋丹丹
一个简单的信号量
发信方
1/0
收信方
共享资源
如 它 的 (如 却 却把O进解果作又仍果S为μ入除一用要因一_一就等E个就使了C为个v/绪待正是它没正e把O个状状在n把S进有在t-描态态等T调入获等I任a。)待I述用就取待s使这k后的绪这事事事W务时,任用状个件件a件要再务态i函等的叫置t调把(具的,数原任)做用任备这函的因务数于O务事了时任而已S数据在_可要件务未经等E。任结以v调具在超e控务n该运用构备任过待t就T制O行a可函了务S统s绪_的k块以状等等ER数表一v条d运待待eE中y的n件C起(态行的表t对B)T,函原的时O中的来应(那数要条间的型的数,)么。件,函位位为就该调,置置要函:清1使,数用0
在一般的情况下,这个初始值为NULL;但也可以 事先vo定id义*O一SM个b邮ox箱Pen,d (然后把这个邮箱的指针作为参 数指向传OIINN一递STT_18个到E6UVU邮函E*teNir箱数mrTe。O*opuSet,vMenbto, x//C请r求ea消t//e//息等错( )邮待误中箱时信,指限息使针之一开始就