UCOS学习日(5)任务间的通讯,事件控制块,信号量的详细操作
任务间的通信
任务之间的协调运行非常有必要,否则系统将会出现非常严重的问题。
UCOS提供一个事件控制块来控制任务之间的通讯事件的类型
信号量
互斥信号量
消息队列
消息邮箱
信号量计数器
统计信号量的数
消息邮箱或消息队列的指针
等待事件的任务组和任务等待表
类似于任务就绪表一样的结构
任务对应位为1就表示任务为该事件的等待任务。
而系统初始化时,也会根据最大任务OS_MAX_EVENTS来创建多少个事件控制块
创建一个事件的时候就会从空的事件控制块列表中取出一个,删除一个事件就会归还给事件控制列表
信号量
信号量有普通的信号量 还有一种互斥信号量
任务获得信号量就-- 任务释放信号量就++
对应的等待任务看见没有信号量就不会执行相应的操作。
这样就不会对一些共享资源造成冲突,例如公共电话亭,有三个电话,同时就只能三个人打电话,第四个人只能等待。
互斥信号量的话就是二值信号量,就是公共电话亭就只有一个电话
消息邮箱
消息队列
消息队列简单来说是消息邮箱的升级版
信号量及其操作
创建信号量
返回一个事件控制块指针,创建信号量之前要定义一个事件控制块指针来接收这个函数的返回值
请求信号量
等待时限为0则无限等待,err是这个函数的执行结果
如果需要一个任务在发现信号量没有时不进入等待状态继续运行就调用函数
发送信号量
发送信号量,如果没有等待任务就信号量++,如果有等待任务那么直接就绪从而引发一次任务调度
删除信号量
删除任务条件可以是
OS_DEL_NO_PEND
没有等待任务再删除
也可以是
OS_DEL_ALLWAYS
无论有没有等待任务都直接删除信号量