4、uCOS-II-任务同步与通信-2

合集下载

ucos-II-任务通信与同步

ucos-II-任务通信与同步

任务的同步与一个通信初解操作系统就像就像一个好的家长,控制着资源的公平分配应用程序中的各个任务,必须通过彼此之间的有效合作,才能完成一项大规模的工作。

因为这些任务在运行时,经常需要相互无冲突地访问一个共享资源,或者需要相互支持和依赖,甚至有时候还需要互相加以必要的制约,才能保证任务的顺利进行。

因此操作系统必须具有对任务运行进行协调的能力,从而使任务之间可以无冲突,流畅的同步运行,而不致导致灾难性的后果。

这与人们依靠通信来相互沟通,从而使人际关系和谐,工作顺利的做法是一样的,计算机系统依靠任务间的良好通信来保证任务与任务的同步。

任何为任务所占用的实体都可以称为资源。

资源可以是输入输出设备,比如打印机,键盘显示器,资源也可以是一个变量,一个结构或者是一个数组。

1任务的同步和事件嵌入式系统中的各个任务是为同一个大的任务服务的子任务,他们不可避免的要共同使用一些资源,并且在处理一些需要多个任务共同协同来完成的工作时,还需要相互的支持和限制。

因此,对一个完善的多任务操作系统来说,系统必须具有完备的同步和通信机制任务的同步:为了实现各个任务之间的合作和无冲突的运行,在各个任务之间必须建立一些制约关系。

其中一种制约关系叫做直接制约关系,另一种制约关系叫做间接制约关系直接制约关系来自任务的合作:例如,有任务A和任务B两个任务,他们需要通过访问同一个数据缓冲区合作完成一项工作,任务A负责向缓冲区写入数据,任务B负责向缓冲区读取该数据。

显然,当任务A还未向缓冲区写入数据时(缓冲区为空时),任务B因不能从缓冲区得到有效地数据而应处于等待状态;只有等任务A向缓冲区写入了数据之后,才应该通知任务B去读取数据。

相反,当缓冲区的数据还未被任务B读取时(缓冲区为满时),任务A就不能向缓冲区写入新的数据而应该处于等待状态;只有当任务B自缓冲区读取数据后,才应该通知任务A写入数据。

显然,如果这两个任务不能如此协调工作,将势必造成严重的后果。

uCOS-II任务间通讯和同步实验15页

uCOS-II任务间通讯和同步实验15页
3
二 实验内容
实验内容
使用信号量实现任务间同步 使用邮箱实现任务之间的通讯
4
三 预备知识
预备知识
了解操作系统任务调度的机制 了解操作系统任务间通讯的机制 学习uC/OS-II操作系统下多任务应用程序的编写方法
5
四 实验设备
实验设备
JX44B0教学实验箱 ADT1000仿真器和ADT IDE集成开发环境 串口连接线
JX44B0实验系统教案 uC/OS-II任务间通讯和同步实验
武汉创维特信息技术有限公司
11.01.2020
提纲
1
实验目的
2 实验内容
3 预备知识
4 实验设备
5 基础知识 6 实验过程 7 实验报告要求
2
一 实验目的
实验目的
掌握uC/OS-II操作系统下使用信号量解决任务之间的同步 问题
掌握uC/OS-II操作系统下任务间通讯的-II中使用消息队列实现任务之间的通讯
消息队列是uC/OS-II中另一种通讯机制,它可以使一个任 务或者中断服务子程序向另一个任务发送以指针方式定义 的变量。因具体的应用有所不同,每个指针指向的数据结 构变量也有所不同。
uC/OS-II提供了7个对消息队列进行操作的函数:创建消 息队列函数OSQCreate(),等待消息队列函数OSQPend(), 先进先出(FIFO)发送消息函数OSQPost(),后进先出(LIFO) 发送消息函数OSQPostFront(),无等待获取消息函数 OSQAccept(),清空消息队列函数OSQFlush()和查询消息 队列函数OSQQuery()。
12
六 实验过程
实验过程
13
六 实验报告要求

实验2 uCOS-II任务间通讯和同步实验

实验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()函数的任务要进入睡眠状态,等待另一个任务(或者中断服务子程序)发出该信号量。

ucOS-II入门经典教程

ucOS-II入门经典教程
任务的优先级别。
任务在内存中的结构
void MyTask(void *pdata) { 临界段 for (;;) { 可以被中断的用户代码; OS_ENTER_CRITICAL( );//进入临界段(关中断) 不可以被中断的用户代码; OS_EXIT_CRITICAL( ); //退出临界段(开中断) 可以被中断的用户代码; } 无限循 }
使用上的特点:
1。分类存放; 2。检索速度快 且恒定; 3。缺点:占用 连续空间大
a[1] a[2] a[3] …
a[9] …
应用:记录同类事物的表
操作系统中经常使用 的数据结构(位图)
a[10] (可以记录80个事物的状态)
位图是数组的一种 特殊应用
D7 D6 D5 D4 D3 D2 D1 D0
嵌入式实时操作系统 μC/OS-II讲座
北 华 大 学 任哲
2006 广州
为什么要学习μC/OS-II
一.凡从事嵌入式系统开发工作的人,必须 对嵌入式操作系统有足够的了解。 二.对于初学者,从μC/OS-II开始是个明智的选择。 1. μC/OS-II麻雀虽小,却五脏基本全(它是个微 内核)。 2.可以学习实时系统的一些编程技巧。 3.可以把在学校中学到的操作系统抽象概念具体 化。 4.具有很强的实用性。 5.学习数据结构应用的好例子。
计算机操作系统的功能
任务管理
任务表
存储管理
存储 分配表
处理器的管理
总之,需要一大堆表
操作系统
设备表
文件管理
文件 目录
网络和通信的 管理
I/O设备管理
操作系统中经常使用 的数据结构(数组)
数组 int a[10] 1。同一数据类型数据 a 的集合; 2。占用连续内存空间; a+1 3。其中的所有元素名 a+2 称都相同,但每个元 a+3 素都有一个编号; 4。元素名去掉编号 a+9 (下标),得到的是 数组名,数组名是个 指针。 a[0]

嵌入式实时操作系统题库1

嵌入式实时操作系统题库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的控制权。

uCOS II简介

uCOS II简介

uCOS II简介u C / O S 是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统实时操作系统(Real Time Operating System,简称RTOS),高性能的 Windows实时扩展,最多可支持32个处理器的系统,127个线程优先级,微秒级中断延迟。

支持实时以太网、更多>>。

μC/OS-II 的前身是μC/OS,最早出自于1992 年美国嵌入式系统专家Jean brosse 在《嵌入式系统编程》杂志的5 月和6 月刊上刊登的文章连载,并把μC/OS 的源码发布在该杂志的B B S 上。

μC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。

CPU硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。

用户只要有标准的ANSI的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌人到开发的产品中。

μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至 2KB 。

μC/OS-II 已经移植到了几乎所有知名的CPU 上。

严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。

没有提供输入输出管理,文件系统,网络等额外的服务。

但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。

uC/OS-II目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断任务管理uC/OS-II 中最多可以支持64 个任务,分别对应优先级0~63,其中0 为最高优先级。

63为最低级,系统保留了4个最高优先级的任务和4个最低优先级的任务,所有用户可以使用的任务数有56个。

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

嵌入式操作系统_第7章 ucOS-II - 任务的同步互斥通信
释印做畅与系是黄宋黄时缓态之放机,宏丹宏地人和依(冲,后:丹:同们谐靠后的那别:腿缓区只,步依、任,使么走我是冲得有才啊自你运靠工务系用也!己自区到等应行通作之统权会的己信 顺 间,为有任该腿的才。造,,来 利 的而空效务通能如成我但互 的 良不A时数知爱手向唤果极相 做 好致走是)据任缓醒这大就咱沟 法 通导,而务走俩通 一 信致冲任两的,的B任应, 样 来灾区去务个混你呀务该管!从 , 保难写取B任乱不B使处而计证性入因数务着。使算任的其于!了据不不人机务后获等数。能这际系与果得待据从样关统任。打状
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

经典ucOS-II入门教程 第3章(共3章)

经典ucOS-II入门教程 第3章(共3章)

第4章任务的同步与通信系统中的多个任务在运行时,经常需要互相无冲突地访问同一个共享资源,或者需要互相支持和依赖,甚至有时还要互相加以必要的限制和制约,才保证任务的顺利运行。

因此,操作系统必须具有对任务的运行进行协调的能力,从而使任务之间可以无冲突、流畅地同步运行,而不致导致灾难性的后果。

与人们依靠通信来互相沟通,从而使人际关系和谐、工作顺利的做法一样,计算机系统是依靠任务之间的良好通信来保证任务与任务的同步的。

例如,两个任务:任务A和任务B,它们需要通过访问同一个数据缓冲区合作完成一项工作,任务A负责向缓冲区写入数据,任务B负责从缓冲区读取该数据。

显然,当任务A还未向缓冲区写入数据时(缓冲区为空时),任务B因不能从缓冲区得到有效数据而应该处于等待状态,只有等任务A向缓冲区写入了数据之后,才应该通知任务B去取数据。

例如,任务A和任务B共享一台打印机,如果系统已经把打印机分配给了任务A,则任务B因不能获得打印机的使用权而应该处于等待状态,只有当任务A把打印机释放后,系统才能唤醒任务B使其获得打印机的使用权。

如果这两个任务不这样做,那么也会造成极大的混乱。

总之,多个任务共享同一资源或有工作顺序要求时,在正式工作之前要互相打招呼。

黄宏:别走啊!宋丹丹:我自己的腿,我爱走就走,你管不着!黄宏:腿是你自己的,但手是咱俩的呀!事件任务间的同步依赖于任务间的通信。

在μC/OS-II 中,是使用信号量、邮箱(消息邮箱)和消息队列这些被称作事件的中间环节来实现任务之间的通信的。

宋丹丹黄宏一个简单的信号量发信方1/0收信方共享资源事件控制块为了把描述事件的数据结构统一起来,μC/OS-II使用叫做事件控制块ECB的数据结构来描述诸如信号量、邮箱(消息邮箱)和消息队列这些事件。

事件控制块中包含包括等待任务表在内的所有有关事件的数据typedef struct {INT8U OSEventType;//事件的类型INT16U OSEventCnt;//信号量计数器void *OSEventPtr;//消息或消息队列的指针INT8U OSEventGrp;//等待事件的任务组INT8U OSEventTbl[OS_EVENT_TBL_SIZE];//任务等待表} OS_EVENT;把一个任务置于等待状态要调用OS_EventTaskWait( )函数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
某一分布式系统,需要主设备(M_Dev)使用同一个 UART 资源分别与从设备1(S_Dev1)和从设备2(S_Dev2) 以不同的 “串行通信模式” 进行通信。
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 任务间的同步和事件控制块
任务之间的这种相互制约、相互合作的运行机 制称为 “任务间的同步”
系统中任务之间相互传递事件,来实现任务的 同步、协作。
备注:用户自定义全局变量的方法,也可以编程实现程序间的信息 传递。但如果想将信息传递的各项功能作完备,工作量是比较 大的。况且,这类需求在应用系统设计中是很常用的。
uC/OS-II 中将此类工作以系统功能方式提供与用户 ---- 事件操作。
2020/8/23
page 6
举例:任务间的共享资源竞争问题及处理方式。
void * msg_ptr; INT16U AD_Value; void main(void) //系统主函数 { OSInit();
......; OSTaskCreate(Task_A,(void *)pdata,......); OSTaskCreate(Task_B,(void *)pdata,......); ......; OSStart(); }
任务的同步与通信
一个应用系统通常是由多个任务组成,任务之间互相协 作共同完成目标功能。例如任务对共享资源竞争,先采 集数据才能处理数据等情况。(任务的同步控制,共享 资源的竞争,任务间的通信等问题的解决方案---OS)
任务间的同步信” 的方式,实现任务 的信息传递和同步控制, “任务通信” 的载体就是 ---事件。
2020/8/23
page 2
目录
1、 任务间的同步和事件控制块 2、 信号量及其操作 3、互斥型信号量和任务优先级反转 4、消息邮箱及其操作 5、消息队列及其操作
2020/8/23
page 3
1 任务间的同步和事件控制块
任务间的同步 --- 各任务运行的先后、触发等关系
Task_A
void Task_B(void * pdata) { ......; //Task_B环境初始化
for (;;) { ......; // Task_B 业务 OSTaskCreate(UART_S2_Task,(void *)US2,......); ......; // Task_B 业务 OSTimeDly( yyy ); } }
void Task_A(void * pdata) { ......; //Task_A环境初始化
for (;;) { ......; // Task_A 业务
if (uart_key) { uart_key = FALSE;
OSTaskCreate(UART_S1_Task,(void *)US1,......);
uart_key = TRUE; }
......; // Task_A 业务 OSTimeDly( xxx ); } }
(互斥型任务处理)
说明:通过用户定义全局变量 uart_key 对任务使用共享资源 作约束,可以避免Task_A与 Task_B 冲突竞争,但其管理性 能支持较弱。
void Task_B(void * pdata) { ......; //Task_B环境初始化
Task_B
Task_A Write Data into Data_Buffer
Data_Buffer
Task_B Read Data from Data_Buffer
备注:数据采集任务A 和数据处理任务B 之间存在同步关系。
2020/8/23
page 4
1 任务间的同步和事件控制块
任务间的互斥 --- 共享资源的申请使用
2020/8/23
page 8
BOOLEAN uart_key; void main(void) //系统主函数 { OSInit();
......; uart_key = TRUE; OSTaskCreate(Task_A,(void *)pdata,......); OSTaskCreate(Task_B,(void *)pdata,......); ......; OSStart(); }
for (;;) { ......; // Task_B 业务
if (uart_key) { uart_key = FALSE;
OSTaskCreate(UART_S2_Task,(void *)US2,......);
uart_key = TRUE; }
......; // Task_B 业务 OSTimeDly( yyy ); } }
......; OSTaskCreate(Task_A,(void *)pdata,......); OSTaskCreate(Task_B,(void *)pdata,......); ......; OSStart(); }
说明:如此设计未对共享资源作任 何约束,实际运行中可能发生 Task_A与Task_B 冲突竞争。
相关文档
最新文档