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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

6

基础知识
uC/OS-II任务之间的通讯与同步方式
在µC/OS-II中,有多种方法可以保护任务之间的共享数
据和提供任务之间的通讯。
利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来关闭中断和打开 中断。当两个任务或者一个任务和一个中断服务子程序共享某些数据

基础知识
uC/OS-IIຫໍສະໝຸດ Baidu使用邮箱
邮箱可使一个任务或者中断服务子程序向另一个任务发送 一个指针型的变量。该指针指向一个包含了特定“消息” 的数据结构。通过调用OSMboxCreate()函数来创建邮箱, 并指定指针的初始值。如果使用邮箱的目的是用来通知一 个事件的发生(发送一条消息),那么就要初始化该邮箱 为NULL,因为在开始时,事件还没有发生。如果用户用邮 箱来共享某些资源,那么就要初始化该邮箱为一个非NULL 的指针。在这种情况下,邮箱被当成一个二值信号量使用。 使用邮箱同样可以实现任务间的同步。 通过OSMboxPost()函数发送一个消息到邮箱中,通过 OSMboxPend()函数等待一个邮箱中的消息,如果邮箱中没 有可用的消息,OSMboxPend()的调用任务就被挂起,直到 邮箱中有了消息或者等待超时。
JX44B0实验系统教案 uC/OS-II任务间通讯和同步实验
武汉创维特信息技术有限公司
2018/9/15
提纲
1
实验目的
2
实验内容
3 4
预备知识
实验设备
5
6
基础知识
实验过程
2
7
实验报告要求

实验目的
实验目的
掌握uC/OS-II操作系统下使用信号量解决任务之间的同步 问题 掌握uC/OS-II操作系统下任务间通讯的方法
12

实验过程
实验过程
13

实验报告要求
实验报告要求
简述邮箱和信号量的作用?
简述邮箱和信号量的在ucOS中的是如何实现的?
14
10

基础知识
uC/OS-II中使用邮箱进行任务之间通讯
下面的代码每100个时钟节拍从TaskSEG中发送一个字符串, 在TaskLED中接收并打印出来。
11

基础知识
uC/OS-II中使用消息队列实现任务之间的通讯
消息队列是uC/OS-II中另一种通讯机制,它可以使一个任 务或者中断服务子程序向另一个任务发送以指针方式定义 的变量。因具体的应用有所不同,每个指针指向的数据结 构变量也有所不同。 uC/OS-II提供了7个对消息队列进行操作的函数:创建消 息队列函数OSQCreate(),等待消息队列函数OSQPend(), 先进先出(FIFO)发送消息函数OSQPost(),后进先出(LIFO) 发送消息函数OSQPostFront(),无等待获取消息函数 OSQAccept(),清空消息队列函数OSQFlush()和查询消息 队列函数OSQQuery()。

基础知识
uC/OS-II中使用信号量进行任务之间同步
右边的代码使用两个信 号量实现了两个任务之 间的同步。信号量创建 的代码如下,信号量 Sem2初始为可用状态, 而信号量Sem1初始为不 可用状态。 Sem1 = OSSemCreate(0); Sem2 = OSSemCreate(1); 任务TaskLED必须等待 Sem2可用才能够继续往 下运行,而Sem2在 TaskSEG中发送。同样 TaskSEG必须等待Sem1可 用才能够继续往下运行, 而Sem1在TaskLED中发送, 这样就实现了程序中 “…”之间代码的顺序执 行,而不受OSTimeDly的 延时值的影响。 9
3

实验内容
实验内容
使用信号量实现任务间同步 使用邮箱实现任务之间的通讯
4

预备知识
预备知识
了解操作系统任务调度的机制 了解操作系统任务间通讯的机制 学习uC/OS-II操作系统下多任务应用程序的编写方法
5

实验设备
实验设备
JX44B0教学实验箱 ADT1000仿真器和ADT IDE集成开发环境 串口连接线
时,可以采用这种方法
利用函数OSSchedLock()和OSSchekUnlock()对µC/OS-II中的任务调度 函数上锁和开锁
信号量
邮箱 队列
7

基础知识
uC/OS-II中使用信号量
通过调用OSSemCreate()建立信号量,并对信号量的初始 计数值赋值。该初始值为0到65,535之间的一个数。如果 信号量是用来表示一个或者多个事件的发生,那么该信号 量的初始值应设为0。如果信号量是用于对共享资源的访 问,那么该信号量的初始值应设为1(例如,把它当作二 值信号量使用)。 通过调用OSSemPost()函数发送一个信号量,通过调用 OSSemPend()函数等待一个信号量。如果信号量当前是可 用的(信号量的计数值大于0),将信号量的计数值减1, 然后函数将“无错”错误代码返回给它的调用函数。如果 信号量的计数值为0,而OSSemPend()函数又不是由中断服 务子程序调用的,则调用OSSemPend()函数的任务要进入 睡眠状态,等待另一个任务(或者中断服务子程序)发出 该信号量。 8
相关文档
最新文档