第4章 任务的同步与通信
4.1 任务间的同步和事件控制块98
4.1.1 任务间的同步98
4.1.2 事件99
4.1.3 事件控制块112
4.1.4 操作事件控制块的函数113
4.1.5 空事件控制块链表115
4.2 信号量及其操作115
4.2.1 信号量115
4.2.2 信号量的操作116
4.3 互斥型信号量和任务优先级反转124
4.3.1 任务优先级的反转现象124
4.3.2 互斥型信号量130
4.4 消息邮箱及其操作133
4.4.1 消息邮箱133
4.4.2 消息邮箱的操作133
4.5 消息队列及其操作139
4.5.1 消息队列139
4.5.2 消息队列的操作142
4.6 小结148
1. 同步
系统中任务的同步是依靠任务与任务之间互相发送消息来保证同步的。
2. 事件
信号量、邮箱(消息邮箱)和消息队列。
发送事件、请求事件是全局函数。
3. 信号量 SEM
互斥性信号量:可以实现共享资源独占式占用的二值信号。MUTEX
信号量:计数式的信号。
4. 消息邮箱 MBOX
用来传递消息缓冲区指针的数据结构。
5. 消息队列 Q
数组的每个元素都存放消息缓冲区指针的数据结构。
6. 等待任务列表
OSEventTbl[ ] 等待任务表
OSEventGrp 等待事件的任务组
7. 事件控制块 ECB
OSEventType 事件的类型
OSEventCnt 信号量计数器
OSEventPtr 消息或消息队列的指针
OSEventGrp 等待事件的任务组
OSEventTbl[OS_EVENT_TBL_SIZE] 任务等待表
应用程序中的任务通过指针pevent来访问事件控制块。
8. 操作事件控制块的函数
OS_EventWaitListInit():事件控制块的初始化函数。
在OSXXXCreate()创建事件时所调用。
OS_EventTaskWait():使一个任务进入等待状态的函数。
在OSXXXPend()请求一个事件时所调用。
OS_EventTaskRdy():使一个正在等待任务进入就绪状态的函数。
在OSXXXPost()发送一个事件时所调用。
OS_EventTO():使一个等待超时的任务进入就绪状态的函数。
在OSXXXPend()请求一个事件时所调用。
9. 空事件控制块链表
共OS_MAX_EVENTS个空事件控制块
OSEventFreeList指针
10. 信号量的操作
信号量由信号量计数器OSEventCnt和任务等待表OSEventTbl[]两部分组成。
OSSemCreate()
创建信号量
OSSemPend()
请求信号量(如果参数timeout被设置为0,则表明任务的等待时间为无限长)
OSSemAccept()
请求信号量(信号量无效时准许任务不进入等待状态而继续运行)
OSSemPost()
发送信号量
OSSemDel()
删除信号量
OSSemQuery()
查询信号量的状态
11. 互斥性信号量会出现任务优先级反转的问题。
因为一个优先级别较低的任务在获得了信号量使用共享资源期间,被具有较高优先级别的任务所打断而不能释放信号量,从而使正在等待这个信号量的更高优先级别的任务因得不到信号量而被迫处于等待状态,在这个等待期间,就让优先级别低于它而高于占据信号量的任务的任务先运行了。
事件控制块成员OSEventCnt,低8位存放信号值(0xFF信号为有效),高8位存放要提升的优先级prio。
OSMutexCreate()
创建互斥性信号量
OSMutexPend()
请求互斥性信号量(如果参数timeout被设置为0,则表明任务的等待时间为无限长)
OSMutexAccept()
请求互斥性信号量(无等待地请求一个互斥性信号量)
OSMutexPost()
发送互斥性信号量
OSMutexQuery()
查询互斥性信号量的状态
OSMutexDel()
删除互斥性信号量
12. 消息邮箱的操作
OSMboxCreate()
创建消息邮箱
OSMboxPost()
向消息邮箱发送消息(pevent消息邮箱指针,msg消息指针)
OSMboxPostOpt()
以广播的形式向消息邮箱发送消息
OSMboxPend()
请求消息邮箱(如果参数timeout被设置为0,则表明任务的等待时间为无限长)
OSMboxAccept()
请求消息邮箱(无等待地请求一个消息邮箱)
OSMboxQuery()
查询消息邮箱
OSMboxDel()
删除消息邮箱
13. 消息队列的操作
消息队列的组成:事件控制块,消息队列,消息。
事件控制块成员OSEventPtr指向一个叫做队列控制块(OS_Q)的结构,该结构管理一个数组MsgTbl[ ],该数组中的元素都是一些指向消息的指针。
MsgTbl[ ]消息指针数组
队列控制块
记录了消息指针数组的基本参数。
消息队列的事件控制块、队列控制块、消息指针数组和消息之间的关系如P140图所示。
OSQCreate()
创建消息队列
OSQPend()
请求消息队列(如果参数timeout被设置为0,则表明任务的等待时间为无限长)
OSQAccept()
请求消息队列(无等待地请求一个消息队列)
OSQPost() (以FIFO先进先出的方式组织消息队列)
向消息队列发送消息(pevent消息队列的指针,msg消息指针)
OSQPostFront() (以LIFO后进先出的方式组织消息队列)
向消息队列发送消息
OSQPostOpt()
以广播的形式通过消息队列发送消息
OSQFlush()
清空消息队列
OSQDel()
删除消息队列
OSQQuery()
查询消息队列
文章评论(0条评论)
登录后参与讨论