第
4章
任务
的
同
步
与
通信
应
用程
序
中
的各
个任
务
,必
须
通过彼
此
之
间
的有
效合
作
,才
能完
成
一
项大
规模
的
工
作
。
因
为
这
些
任
务
在
运
行
时
,经
常
需
要
互
相
无冲
突
地
访
问同
∵
个共
享
资
源
,或
者
需
要
互
相支
持
和
依
赖
,甚
至
有
时
还
要
互
相加
以必要
的
制
约
,才
能
保
证
任
务
的顺利
运
行
。
因
此
,操
作
系统
必
须具
有
对任
务
的
运
行
进行
协
调
的能力
,从
而
使
任
务
之
间
可
以无冲突
、
流
畅
地
同
步
运
行
,而 不
致
导致灾
难
性
的
后
果
。
与
人们
依
靠
通
信
来
互
相
沟
通
,从
而
使
人
际关
系
和谐
,工
作
顺利
的做
法
一
样
,计
算
机系
统是
依
靠
任
务
之
间
的良好
通
信
来
保
证
任
务
与
任
务
的同步
的
。
本
章
的
主
要
内容
有
:
氵
●
事
件
及
描
述
事
件
的
数
据
结
构
—
—
事
件
控制
块
;
●
信
号
量
及
其
使
用
;
●
消
息
邮
箱
及
其
使
用
;
●
消
息
队
列
及
其
使
用。
4.1
任务闾
的
同
步
和事
件
控
制
块
嵌
人
式
系
统
中
的
各
个任
务都
是
以
并
发
的方
式来
运
行
的
,并
为
同
一
个
大
的
任
务
服务
。
它
们
不可
避
免
地要共
同使
用
一
些
共
享资
源
,并 且
在
处
理
一
些需
要多
个任
务共
同
协作
来完
成
的
工
作
时
,还
需
要
相
互
的
支
持
和限制
。
因
此
,对
于
一
个
完
善
的多任
务操
作
系
统
来说
,系
统
必
须
具
有完
各
的同
步
和
通
信
机
制
。
4.1.1
任务
闾
的
同
步
为
了
实
现各任
务
之
间
的
合
作
和
无冲突
的
运行
,在
各
任
务
之
间
必须
建
立
一
些
制
约关
系
。
其
中
一
种制
约关
系
叫
做
直
接
制
约关
系
,另
一
种制
约关
系则
叫做
间
接制
约关
系
。
直
接
制
约关
系
源于任
务
之
间
的合
作
。
例
如
,有 两
个任
务
:任
务
A和
任
务
B,它
们
需
要
通
过
访
问同
一
个数
据
缓
冲
区
合
作
完
成
一
项
工
作
,任
务
A负
责
向缓
冲
区
写
人
数
据
,任
务
B负
责
从
缓
冲
区
读
敢该
数
据
。
显
然
,当
任
务
A还
未
向缓
冲
区
写
入
数
据
时
(缓
冲
区
为
空时
),任
务
B因
不
能
一
任
务的同步
与
吼
从缓
冲
区
得到
有效数
据
而应
该
处
于等待状态;只
有
等任务
A向
缓
冲
区
写
人
了
数
据
之后
,才
应
该
通
知任务
B去
取
数据
。
相反
,当
缓冲
区
的
数据
还
未被
任
务
B读
取时
(缓
冲
区
为满时
),任
务
A就
不
能向缓冲
区
写
人
新的数据
而
应
该
处
于等
待
状态;只
有
等任务
B自
缓冲
区
读
取
数
据
后
,
才应该
通
知
任务
A去
写
人
数据
.显
然
,如
果这两
个任务不
能
如
此协调
工
作
,将
势
必
造成严重
的后
果
.
间接制约关
系
源
于对
资
源的共
享
。
例
如
,任
务
A和
任
务
B共
享
一
台打印机
,如
果系
统
已
经
把打印机
分
配
给
了
任务
A,则
任务
B因
不
能获得
打印机的
使
用
权
fn应
该
处
于
等待状
态
;只
有当任务
A把
打印
机
释放
后
,系
统才
能唤醒任务
B使
其获得打印机
的使用杈。
如果这两
个
任
务不这
样做
,那
么也
会造
成
极
大的
混
乱
。
由
上
可知
,在
多任务
合作
工
作
的
过程中
,操
作
系
统应该解
决
两
个问题
:一
是
各任务间应
该
具有
一
种
互
斥关系
,即
对于某个共
享资源
,如
果
个任务
正
在
使月J,则
其他任务只
能等
待
,等
到
该任务释放
该资
源后
,等
待的
任
务之
一
才能
使
用它;工
是相关
的任务在
执行
上
要
有先后
次序
|
一
个任务要
等其伙伴发来通知
,或
建立了
某个条
件后
才
能继
续执行
,否
则只能
等待
。
任务
之
问这种制约性的
合作
运
行
机
制叫
做任务间的同
步
。
系统
中任务的
同步是
依靠任务
与任务
之
间
互
相
发
送
消息来
保
证
同步的
.
4.1.2事
件
任
务间的
同步依赖于
任
务间的通
信
。
在
uC/0S—
H中
,使
用
信号量
、
邮箱
(消
息
邮箱
)和
消息队列这些
被称作事件的
中间
环
节来实现
任务
之
间的通
信
。
图
4-1是
两
个任务
通
过事
件进行通
信
的
示
意图。
任务
1是
发
信方
,任
务
2是
收
信
方
.
乍为发
信
方
,任
务
1的
责任是把信息发送
到事
上
上
,这
项
操作叫做发送
事仵
.作
为收
信方
,任
:2的
责任
是通
过读事件
操作对事
件进行查
Ξ
:如
果有
信息
,则
读取
信
息
硇
口
杲
没
有
,则
等
图
::读
事件
操作
叫
做请求事件
。
uC/()S—
H把
任务发送
事件
、
请
求事件
以及
其他
对
事件的
操作
都
定
义
成为
全
局函
数
,以
供
I用
程序的所有
任
务
来
调
用
。
1.信
号
量
信
号量
是
一
类事件
。
使
用
信
号
量的最
初
日
的
,是
为了
共享
资
源设立
一
个表示
该共
享资
源
被占用情况的
标
志。
这样
,就
可
使任务在访问
共享资
源之
前
,先
对这个
标
志
进行查
询
,在
了
解
资
源被
占用的情
况之
后
,再
来决定自
己
的
行为
。
观
察
一
下人
们
日
常
生活
中常用的
一
种共享
资
源
——
公用电话
亭的
使
用
规则
,就
会发现它
妁规则很适
合在协
调
关
系时
应
用
。
如果
一
个
电话亭只允
许
一
个人进
去打电话
,那
么电话
亭的
4-1
两
个
任
务使用
事件进行通
信的示意
图
ˉ
冫Σ×
嵌
入
式实
g寸
操
作
系统uC/os-n原
理及应
用
^
门
上就应
该
有
一
个
可
以
变换
两种颜
色
的牌
子
(例
如
,用
红
色表
示
“
有
人
”
,用
绿
色表
示
“
无人
”
).
当有
人
进
去时
,牌 子会
变
成
红
色
;出 来
时
,牌
子
又会变
成
绿
色
.这 样来
打
电话
的
人就
可根据
牌
子的
颜色
来
了解
电
话亭
的被
占
用情
况
.例 如
,如
果
某
一
个
人
去电
话亭
打
电话
时见
到牌
子
上的
颜色
是
绿色
,那 么
他
就
可
以
进
去打
电话
;如
果是
红色
,那 么
他
只
好等
待
;如 杲
又
陆
续来
了
很
多
人
,那 么就
要排
队
等待
。
显
然
,电
话
亭
门
上的
这个
牌
子就是
一
个
表
示电
话亭
是
否
已被占
用
的
信
号
.
显
然
,这
是
一
个
二
值
信
号
,由
于
这种
二
值
信
号
可
以
实
现共
享
资
源
的独占
式占
用
,所 以叫做
互斥
型
信
号量
.
如
杲
电
话亭
可
以
允
许多
人
打
电话
,那 么电话
亭
门前
就
不应该
是
只有
红色和
绿色
两
种
状
态
的牌
子
,而 应该
是
一
个
计数
器
,并 且这个
计数
器
在每
进
去
一
个
人时
会自
动减
1,而
每
出
去
一
个
人
时会
自动
加
1.如
果计数
器
的初值
按
电
话亭
的
最大容
量
来设
置
,那 么
来
人只
要
见到计数
器
的值
大
于
0,就
可
以进
去打
电话
;否 则
只
好等
待
.这 种计
数
式的信
号叫做信
号量
。
图
4-2是
两个任
务使
用
互斥
型
信
号量
进行
通
信
,从 而
可
便
这
两个任
务
无冲突
地访
问
一
个
共享资
源
的示
意图
.任 务
1在
访
问共享
资
源
之
前先
进行请
求信
号量
的操作
,当
任
务
1发
现
信
号量
的标
志为
“
1” 日
寸
,它
一
方
面
把信
号
量
的标
志由
“
1”
改
为
“
0”
,另
一
方
面进
行共享资
源的
访
问
。
如
果
任
务
2在
任
务
1已
经获得信
号
之后来请
求信
号量
,那 么因为
它获
得的标
志
值
是
“
0”
,所 以
任
务
2就
只
有等
待
而
不
能
访
问共
享资
源
了
(见
图
4-2(a))。 显然
,这
种做
法
可
以有效
地
防
止
两
个任
务
同
时
访
问同
一
个共
享资
源所
造成
的冲
突
。
发
送
信
号
量
请求信
号量
⑶
tsl铹
饕
骣
骒
楼
饔
资撅
,⑴
任
濯
詈瞀翡
营
麽
逗
笋
腐窬
2=nl锵
图
4-2
两个
任务
使
用
信
号量
进行
通信的
示意
图
那
么任
务
2何
时
pT以
访
问共
享
资
源呢
?当 然
是
在任
务
1使
用完
共
享资
源
之后
,由
任
务
l
向信
号量发
信
号
使
信
号
量标
志
的值
由
“
0”
再变为
“
1”
时
,任
务
2就
有
机会
访
问共享资
源
r.同
任
务
1-样
,任 务
2—
∷旦
获
得
F共 享资
源
的访
问杈
,那
么
在
访
问共
享资
源
之
前
一
定
要把信
号
量
标
志的值
由
“
l”
变
为
“
0”
(见
图
4-2(b)).
例
4冖
1
本例
的
应用
程序
中
有
两个
用户
任
务
:MyTask和
Y。 uTask.这 两个任
务都
要
访
问同
一
个
共享
资
源
s,但
Y。 uTask访 问
s需
要的
时间
要
长
一
些
(本
例
中使
用
了
一
个循
环
来模
拟
先
请求信
号
量
后请
求信
号
量
一
任
务
的
同步与通
信
η
已
访问时
间
),而
MyTask访
问
s的
时间要短
一
些
,这
样
就
不可
避免地
出现了在
任务
YouTask访
问
s期
间
,任
务
MyTask也
来访问
s,从
而出现了干
扰
.
答
应
用程
序代
码如下
:
/苄
关关兴兴兴女关
关
¥
汁长关*艹 艹兴*兴
苄
弈关关
X宫
egt *兴
艹关兴桨兴
浒X苄 关*兴 ※关兴头兴
关
义
关关兴关¥艹
*半
※
关艹兴
关
头
泶 /
苯
includo"ir,ˉ 1·
des h"
#de£
⊥
no ,峪
`莹
呸
廴∮
1zE 512
Char*ss;
osLsTK M,· llaskstk[tAsK stK s】
z匝
];
∞
sTK YOuIra趺
s戗
[吧
舔
s:IⅠ I|〖 sI犯
彐
;
〃任
务堆栈长度
〃
定义任
务
堆
栈
区
〃定义任
务堆栈
区
王
皿16s key·
〃
用于
退
出
卩
C/0s-n的
键
∷
∷
ェ
1。
rgu
皿
=o,皿
=0;
〃
宇符
显示
位
置
Ⅱ
∷
Char兴 s="原
始
数据
";
〃定义
要
显
示的
宇符 ∷
vo1d MYTask(vo⊥
d艹
data);
〃
声明任
务
∷
void YOtl%sk(vo1d x data);
〃
声研
任
务
∷
∷
/浒
*※
关关
苄
*泶
※矢※苄关
艹产
兴兴**关 籼
ˉ
≠艹
主
函
数
艹
浒x。
/关
-*|I*∮
女
I’
·
x兴
|*夹
Ix【
x芦
I【
|下 0∮
艹
||∷
∴
/∷
∷∷
∷
∷
∷
∷
∷
ˇ
0id ∷砸a±n (Vo⊥ d)
∷
∷
∷
∷
∷
∷
∷
∷
∷
∷
(
∷
¨
0s1n土△
();
〃
初
始化
uF/°
s^1I
∷
∷
∷
∷
∷
∷
∷
∷
PC∞
ss柳
eReturn(〉
;
〃
保存
DOs环
境
∷
卸
§
Ct№
t(uc∞
,0SC这
鲕
),
〃
安装
。
c/∞
-I】
中
断 ∷
∷∷
0s它 askCreate(MyTask, //呛
刂
9ˉ
g任
务
MyTask
∷
(的
王d兴
)0,
〃
给任
务传递
参
数
∷
∷
∷
剐vTas浴
tkEˉA眯 叨
廴舡
豳
-1彐
,
〃设置任
务堆
栈栈
顶
指针
∷
o);
〃
使任
务
的优
先级别
为
0
∷∷
∷
∞start();
〃启动
多
任
务
管
理 ∷
∷
/
兴
关
¥ 兴
关
艹 x*x兴
艹 兴 关 兴 ※ 矢 +¥ 兴 桊 艹 头
长
乍
丘
矽
升 M·
|rask x艹
※ ※ x艹 ※ 关 关 ¥ *关 兴
Ⅹ X艹 兴
X*¥
+於
兴 关 綮 关 头 兴 *¥ 义
ˉ
J
void Ms Task(tl,⊥
d
兴
F,tlata)
枯
立f0s~CR1TICΛ 巳
lqET⑩
D == 3
0s~CpU sR cp¨
r;
镣
endif
∷
狼
嵌
^式
实
B寸
酒
乏
作
系统 uC/os-II原
理及应用
^
工
NT8U eFr;
∷
pdg|a = pd命 △
a;
o巾
WⅡ
uRITIC3丨
();
PC /eC1set(o举
98,
。sTickI$R);
∷
∷
∷
空
q」
$etlr土
d识
。
t0(0sLTiC鸱
p皿
sEc);
∷
。.LΞ
Ⅻ
T cpェ
iKALO;
∷ osstatIh⊥
t();
0s。J’ askCrea1e(Y。
uTask,
(vo1d关
)0,
&YoliTasks诙
[lIAs/sTK SIzE-1],
∷
2);
∷
for(;;)
(
s=!ˇ
延
氵
sk访
间共享
数
据
s",
P廴DiSpstr(5,++y1,
D工sP~BGND~BLaCK+Dェ
sp FGND WnITE);
〃如果按
下
ESC键
,则 退
出
uc/∞
-II
∷
∷
主£
(pc Ge|Key(&kOD == TRln)
∷
∷ (
iF(keˇ
亠
= o苓
1B)
(
PC DOsReour,();
)
)
0sT± meD1y(200);
∷
)
∷
/关
妥关艹关
*关 兴半*兴 X兴
关关关※芳长
关兴关
*兴
任
务
YouTask
vo圭 d Yo丿
task (V0id
头
pdata)
(
∷
∷
∷
甘
ifoⅡ
R王 TI∞
山 METnOD == 3
∷
∷
0廴
∞
1J枣
Ⅱ
辶
Lsr;
艹
elld亠
£
∷
∷
∷
工NT8V
ρ
rF;
∷
∷
∶
穸
,:严
=
∷
婴
—
—
槲
〃等待
200个
时钟节拍
女k¥ 兴艹
。/’●
X※
关兴兴
*头 义兴关兴
艹艹
长
关兴
苄
*关
艹兴兴头
/
〃
安装
时
钟中
断
向量
〃设置
uc/。
s~II时
钟
频率
〃
初
始
化
统
计任务
〃创建
任务
№uT。 sk
〃给任务传
递
参
数
〃设萱任务
堆栈栈
顶指针
〃
使任务的
优先级
别为
2
〃显
示
字符串
{lllllI1Ⅱ
J■
JⅡ
■
■
□
■
■
■
■
Ⅱ
■
■
■
■
■
■
■