uC/OS-II任务间的同步及事件

一. 什么是同步

为了实现各个任务之间的合作和无冲突的运行,在各任务之间必须建立一些制约关系。

一是各任务间应该具有一种互斥关系,即对于某个共享资源,如果一个任务正在使用,则其他任务只能等待,等到该任务释放该资源后,等待的任务之一才能使用它;

二是相关的任务在执行上要有先后次序,一个任务要等其伙伴发来通知,或建立了某个条件后才能继续执行,否则只能等待。

任务之间的这种制约的合作运行机制叫做任务间的同步。

二. 什么是事作

ucos使用信号量、邮箱和消息队列这些中间环节来实现任务之间的通信,这些中间环节称作“事件”
ucos用事件等待任务表来表示事作:
OSEventTb1[ ],作为等待事件任务的记录表,即等待任务表,该位为“1”来表示这一位对应的任务为事件的等待任务,“0”不是等待任务。
OSEventGrp,来表示等待任务表中的任务组。

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;


操作事件控制块的函数:
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任务间的同步及事件)