uC/OS-II任务间的同步及事件
2013-04-07 11:03
330 查看
[b][b]一. 什么是同步
[/b][/b]
为了实现各个任务之间的合作和无冲突的运行,在各任务之间必须建立一些制约关系。
一是各任务间应该具有一种互斥关系,即对于某个共享资源,如果一个任务正在使用,则其他任务只能等待,等到该任务释放该资源后,等待的任务之一才能使用它;
二是相关的任务在执行上要有先后次序,一个任务要等其伙伴发来通知,或建立了某个条件后才能继续执行,否则只能等待。
任务之间的这种制约的合作运行机制叫做任务间的同步。
[b][b][b][b]二. 什么是事作[/b]
[/b][/b][/b]
ucos使用信号量、邮箱和消息队列这些中间环节来实现任务之间的通信,这些中间环节称作“事件”。
ucos用事件等待任务表来表示事作:
OSEventTb1[ ],作为等待事件任务的记录表,即等待任务表,该位为“1”来表示这一位对应的任务为事件的等待任务,“0”不是等待任务。
OSEventGrp,来表示等待任务表中的任务组。
![](http://img.my.csdn.net/uploads/201304/07/1365303797_2622.jpg)
ucos用事件控制块来表示其结构:
![](http://img.my.csdn.net/uploads/201304/07/1365303831_5652.jpg)
操作事件控制块的函数:
1. 事件控制块的初始化函数
XXX -- Sem(对信号量进行操作的函数), Mutex(对互斥型信号量进行操作的函数),Mbox(对消息邮箱进行操作的函数),Q(对消息队列进行操作的函数)
2. 使一个任务进行等待状态的函数
3. 使一个正在等待的任务进行就绪状态的函数
4. 使一个等待超时的任务进入就绪状态的函数
[/b][/b]
为了实现各个任务之间的合作和无冲突的运行,在各任务之间必须建立一些制约关系。
一是各任务间应该具有一种互斥关系,即对于某个共享资源,如果一个任务正在使用,则其他任务只能等待,等到该任务释放该资源后,等待的任务之一才能使用它;
二是相关的任务在执行上要有先后次序,一个任务要等其伙伴发来通知,或建立了某个条件后才能继续执行,否则只能等待。
任务之间的这种制约的合作运行机制叫做任务间的同步。
[b][b][b][b]二. 什么是事作[/b]
[/b][/b][/b]
ucos使用信号量、邮箱和消息队列这些中间环节来实现任务之间的通信,这些中间环节称作“事件”。
ucos用事件等待任务表来表示事作:
OSEventTb1[ ],作为等待事件任务的记录表,即等待任务表,该位为“1”来表示这一位对应的任务为事件的等待任务,“0”不是等待任务。
OSEventGrp,来表示等待任务表中的任务组。
![](http://img.my.csdn.net/uploads/201304/07/1365303797_2622.jpg)
ucos用事件控制块来表示其结构:
typedef struct { INT8U OSEventType; /* Type of event control block (see OS_EVENT_TYPE_???) */ INT8U OSEventGrp; /* Group corresponding to tasks waiting for event to occur */ INT16U OSEventCnt; /* Semaphore Count (not used if other EVENT type) */ void *OSEventPtr; /* Pointer to message or queue structure */ INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; /* List of tasks waiting for event to occur */ } OS_EVENT;
![](http://img.my.csdn.net/uploads/201304/07/1365303831_5652.jpg)
操作事件控制块的函数:
1. 事件控制块的初始化函数
//作用是把变量OSEventGrp及任务等待表中的每一位都清0,即令事件的任务等待表中不含有任何等待任务。 void OS_EventWaitListInit(OS_EVENT* pevent);这个函数将在任务调用OSXXXCreat()创建事件时调用。
XXX -- Sem(对信号量进行操作的函数), Mutex(对互斥型信号量进行操作的函数),Mbox(对消息邮箱进行操作的函数),Q(对消息队列进行操作的函数)
2. 使一个任务进行等待状态的函数
//作用是把变量OSEventGrp及任务等待表中的相关位都置1。 void OS_EventTaskWait(OS_EVENT* pevent);这个函数将在任务调用函数OSXXXPend()请求一个事件时被调用。
3. 使一个正在等待的任务进行就绪状态的函数
//作用是把任务等待表中的相关位都清0,再把任务就绪表中的位置置1,然后引发一次任务调试。 INT8U OS_EventTaskRdy(OS_EVENT* pevent, void* msg);这个函数将在任务调用函数OSXXXPost()发送一个事件时被调用。
4. 使一个等待超时的任务进入就绪状态的函数
//正在等待事件的任务已经超过了等待的时间,却仍因为没有获得事件等原因而未具备可以运行的条件, //但是却又要使它进行就绪状态,就要调用此函数。 void OS_EventTO(OS_EVENT* pevent);这个函数将在任务调用函数OSXXXPend()请求一个事件时被调用。
相关文章推荐
- UC/OS-II基础知识之任务的同步与事件
- uC/OS-II同步行为----事件标志组
- [uC/OS-II原理及应用]任务的同步与通信
- uC/OS-II的任务同步与通信
- uC/OS-II的任务同步与通信
- 【iCore4 双核心板_uC/OS-II】例程六:信号量——任务同步
- UC/OS II 事件标志组管理(二)
- [uC/OS-II原理及应用]UC/OS-II中的任务
- uC/OS-II内核架构解析---uC/OS-II通信与同步
- UC/OS II事件管理(2)之信号量管理
- UC/OS-II中的任务(三)
- uC/OS-II的任务管理和调度
- uC/OS-ii内核源码理解(五)创建任务函数
- uc/os-ii删除任务
- uc/os-ii任务延时
- uC/OS - II 之事件控制块学习笔记
- uC/OS-II 学习笔记之:任务删除
- uC/OS-II 中的任务
- UC/OS-II基础知识之事件控制块及事件处理函数
- uC/OS-II任务调度中判断最高优先级