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

Download Report

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

JXARM9-2410实验系统教案
uC/OS-II任务间通讯和同步实验
2015/4/13
提纲
1
实验目的
2
实验内容
预备知识
3
4
实验设备
5
6
7
基础知识
实验过程
实验报告要求
2
一
实验目的
实验目的
 掌握uC/OS-II操作系统下使用信号量解决任务之间的同步
问题
 掌握uC/OS-II操作系统下任务间通讯的方法
3
二
实验内容
实验内容
 使用信号量实现任务间同步
 使用邮箱实现任务之间的通讯
4
三
预备知识
预备知识
 了解操作系统任务调度的机制
 了解操作系统任务间通讯的机制
 学习uC/OS-II操作系统下多任务应用程序的编写方法
5
四
实验设备
实验设备
 JXARM9-2410教学实验箱
 ADT1000仿真器和ADT IDE集成开发环境
 串口连接线
6
五
基础知识
uC/OS-II任务之间的通讯与同步方式
 在µC/OS-II中,有多种方法可以保护任务之间的共享数
据和提供任务之间的通讯。
 利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来关闭中断和打开
中断。当两个任务或者一个任务和一个中断服务子程序共享某些数据
时,可以采用这种方法
 利用函数OSSchedLock()和OSSchekUnlock()对µC/OS-II中的任务调度
函数上锁和开锁
 信号量
 邮箱
 队列
7
五
基础知识
uC/OS-II中使用信号量
 通过调用OSSemCreate()建立信号量,并对信号量的初始
计数值赋值。该初始值为0到65,535之间的一个数。如果
信号量是用来表示一个或者多个事件的发生,那么该信号
量的初始值应设为0。如果信号量是用于对共享资源的访
问,那么该信号量的初始值应设为1(例如,把它当作二
值信号量使用)。
 通过调用OSSemPost()函数发送一个信号量,通过调用
OSSemPend()函数等待一个信号量。如果信号量当前是可
用的(信号量的计数值大于0),将信号量的计数值减1,
然后函数将“无错”错误代码返回给它的调用函数。如果
信号量的计数值为0,而OSSemPend()函数又不是由中断服
务子程序调用的,则调用OSSemPend()函数的任务要进入
睡眠状态,等待另一个任务(或者中断服务子程序)发出
该信号量。
8
五
基础知识
uC/OS-II中使用信号量进行任务之间同步

右边的代码使用两个信
号量实现了两个任务之
间的同步。信号量创建
的代码如下,信号量
Sem2初始为可用状态,
而信号量Sem1初始为不
可用状态。
Sem1 = OSSemCreate(0);
Sem2 =
OSSemCreate(1);
 任务TaskLED必须等待
Sem2可用才能够继续往
下运行,而Sem2在
TaskSEG中发送。同样
TaskSEG必须等待Sem1可
用才能够继续往下运行,
而Sem1在TaskLED中发送,
这样就实现了程序中
“…”之间代码的顺序执
行,而不受OSTimeDly的
延时值的影响。
9
五
基础知识
uC/OS-II中使用邮箱
 邮箱可使一个任务或者中断服务子程序向另一个任务发送
一个指针型的变量。该指针指向一个包含了特定“消息”
的数据结构。通过调用OSMboxCreate()函数来创建邮箱,
并指定指针的初始值。如果使用邮箱的目的是用来通知一
个事件的发生(发送一条消息),那么就要初始化该邮箱
为NULL,因为在开始时,事件还没有发生。如果用户用邮
箱来共享某些资源,那么就要初始化该邮箱为一个非NULL
的指针。在这种情况下,邮箱被当成一个二值信号量使用。
使用邮箱同样可以实现任务间的同步。
 通过OSMboxPost()函数发送一个消息到邮箱中,通过
OSMboxPend()函数等待一个邮箱中的消息,如果邮箱中没
有可用的消息,OSMboxPend()的调用任务就被挂起,直到
邮箱中有了消息或者等待超时。
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()。
12
六
实验报告要求
实验报告要求
 简述邮箱和信号量的作用?
 简述邮箱和信号量的在ucOS中的是如何实现的?
13