μCos-ii学习笔记3_事件管理
三、事件管理
ucos-ii作为实时多任务操作系统,是事件驱动的。包括信号量、互斥信号量、事件标志组(表示事件的组合)、消息邮箱和消息队列。通过各种事件机制实现多任务间合作和无冲突运行,即任务间同步。
1.事件管理通用数据结构和函数
1>事件控制块ECB(Event Control Block)
事件控制块是事件管理中的核心数据结构,定义成结构体如下。
其中OSEventType可以取0~5分别表示未使用、消息邮箱、消息队列、信号量、互斥信号量和事件标志组。
OSEventPtr(结合OSEventFreeListECB空闲链表指针,即表头地址)用于构建ECB空闲链表。
事件等待组和事件等待表关系类比于TCB中任务就绪组与任务就绪表,用于管理等待任务发生的任务。
2>几个重要函数
1)OS_InitEventList() ECB初始化函数
2)OS_EventWaitListInit() 事件等待表初始化
3)OS_EventTaskWait() 事件等待函数,登记,设置事件等待,阻塞任务
4)OS_ EventTaskRemove() 取消事件等待组合事件等待表中的任务等待标志
5)OS_ EventTaskReady() 将等待事件的任务就绪函数
3>事件管理(以信号量管理为例)
1)OSSemCreate() 建立信号量—使用并配置一个ECB
2)OSSemSet() 设置信号量的值,特殊情况下修改信号量的值
3) OSSemDel() 删除一个信号量
4) OSSemPend() 等待或请求信号量,信号量为0时阻塞自己
5) OSSemAccept() 无等待的请求信号量,即信号量为0时不阻塞自己
6) OSSemPendAbort() 放弃等待信号量
7)OSSemPost() 发出或释放信号量
8) OSSemQuery() 查询信号量,一般用于打印显示
上述信号量管理核心函数中1,4,7是必须的步骤,任务A中创建信号量并设置信号量的值,A中循环请求信号量,得到信号量后任务得到执行,执行完毕后释放信号量,任务B、C中同理。
2各种事件简介
1> 互斥信号量:信号量的值只能为0或者1
1)一种公共资源,制定时刻只能被一个线程占有;
2)控制线程对特定资源(如临界区和共享资源)访问;
3)两个问题:
①锁死—超时等待机制解决;
②优先级反转—优先级继承机制解决;
优先级反转:A因为要等B信号量而后于优先级低于A的C执行,若B优先级很低一直无法得到执行从而释放信号量,则A也一直无法得到执行。
优先级继承机制:将占有信号量的任务优先级提高,确保其对互斥资源处理完成,释放资源后又恢复原来的优先级。
4)特性:互斥访问,所有权特性;
2> 信号量:信号量的值可以大于1
1)一种公共资源,基值是一个32位计数器S,仅有PV操作改变(P:申请资源,S减1;V:释放资源,S加1);
2)场合
①互斥访问:但不支持所有权,是有限个任务同时访问;
②事件通知:生产者(SEM++)------消费者(SEM--)模式;
③线程同步:指明了同时访问资源的线程最大数目。PV操作,C为0时,不允许其他线程对资源进行访问;
3)比互斥量稍快,占用资源更少;
4)事件通知用于两个线程之间;
3> 事件标志组
1)理解:可被任何线程置位,复位和查看(根据事件实际发生情况);
2)应用:适用于同步多线程,或等待多个事件发生的场合,即任务要等待多个事件的发生或者多个事件中某一个发生就可以继续运行;
4> 消息队列:多个消息指针组成的循环缓冲区
1)理解:“队列”数据结构,用来传递多条信息(实际传递的是消息指针);
2)消息队列中分别存放消息缓冲区地址,适合传输很多数据的场合;
3)消息队列侧重于传送数据,而信号量,事件标志组指标是指示作用;
5> 消息邮箱:使一个任务或者中断服务子程序向另一个任务发送一个指针型变量。
3. 总结
本节对事件管理主要数据结构和函数做了简单介绍,结合信号量管理解药叙述了事件管理的基本流程,又对五种事件主要特点和区别加以总结概括。要具体了解每一种事件机理和应用还需要进一步学习。