一. 什么是同步
为了实现各个任务之间的合作和无冲突的运行,在各任务之间必须建立一些制约关系。
一是各任务间应该具有一种互斥关系,即对于某个共享资源,如果一个任务正在使用,则其他任务只能等待,等到该任务释放该资源后,等待的任务之一才能使用它;
二是相关的任务在执行上要有先后次序,一个任务要等其伙伴发来通知,或建立了某个条件后才能继续执行,否则只能等待。
任务之间的这种制约的合作运行机制叫做任务间的同步。
二. 什么是事作
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()请求一个事件时被调用。