一. 什么是同步
为了实现各个任务之间的合作和无冲突的运行,在各任务之间必须建立一些制约关系。
一是各任务间应该具有一种互斥关系,即对于某个共享资源,如果一个任务正在使用,则其他任务只能等待,等到该任务释放该资源后,等待的任务之一才能使用它;
二是相关的任务在执行上要有先后次序,一个任务要等其伙伴发来通知,或建立了某个条件后才能继续执行,否则只能等待。
任务之间的这种制约的合作运行机制叫做任务间的同步。
二. 什么是事作
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;
//作用是把变量OSEventGrp及任务等待表中的每一位都清0,即令事件的任务等待表中不含有任何等待任务。 void OS_EventWaitListInit(OS_EVENT* pevent);这个函数将在任务调用 OSXXXCreat()创建事件时调用。
//作用是把变量OSEventGrp及任务等待表中的相关位都置1。 void OS_EventTaskWait(OS_EVENT* pevent);这个函数将在任务调用函数 OSXXXPend()请求一个事件时被调用。
//作用是把任务等待表中的相关位都清0,再把任务就绪表中的位置置1,然后引发一次任务调试。 INT8U OS_EventTaskRdy(OS_EVENT* pevent, void* msg);这个函数将在任务调用函数 OSXXXPost()发送一个事件时被调用。
//正在等待事件的任务已经超过了等待的时间,却仍因为没有获得事件等原因而未具备可以运行的条件, //但是却又要使它进行就绪状态,就要调用此函数。 void OS_EventTO(OS_EVENT* pevent);这个函数将在任务调用函数 OSXXXPend()请求一个事件时被调用。