Event flags(事件)
事件是实现任务-任务、任务-中断(isr)之间同步的一种机制。一个任务或isr通过设置事件告诉另一任务某一(些)事情发生了;一个任务可以等待某一(些)事件发生后再继续执行。
每一任务有16个事件标志可用。
情景:
甲:我告诉你,某事发生。(set)
乙:我等到,直到你告诉我某事发生。(wait)
函数原型
说明 | 原型 |
在其他任务中清除指定任务的事件标记。 | void os_evt_clr ( U16 clear_flags, OS_TID task ); |
在本任务中,引起os_evt_wait_or的事件发生后,识别是那些事件发生了。 | U16 os_evt_get (void); |
在其他任务中,告诉指定的任务某一(些)发生。 | void os_evt_set ( U16 event_flags, OS_TID task ); |
在本任务中,等待所有指定的事件发生,直到超时。 | OS_RESULT os_evt_wait_and (U16 wait_flags, U16 timeout ); |
在本任务中,等待指定的事件有一个发生,直到超时。 | OS_RESULT os_evt_wait_or (U16 wait_flags, U16 timeout ); |
在IRQ的中断服务程序中,告诉指定的任务某一(些)发生。 | void isr_evt_set (U16 event_flags, OS_TID task ); |
Mutexes(互斥对象)
互斥对象是一种访问临界(Critical)资源的机制。一个任务要使用(请求)(os_mut_wait)某一临界资源,必须要等到另一任务使用完后(os_mut_release)才可以。
情景:
甲:我要做某事,你不要做,我做完了告诉你。(wait、release)
乙:我等到,你做完了告诉我,我再做。(wait)
函数原型
说明 | 原型 |
初始化一个互斥对象 | void os_mut_init (OS_ID mutex ); |
在使用完临界资源后,释放(解锁)一个互斥对象。 | OS_RESULT os_mut_release (OS_ID mutex ); |
尝试获得一个互斥对象。如果此互斥对象未被释放(locked),则等待直到释放或超时;如果此互斥对象已被释放(unlock),则将此互斥对象锁定(lock),任务继续执行。 | OS_RESULT os_mut_wait(OS_ID mutex, U16 timeout ); |
Semaphore(信号量)
信号量与mutex类似,但带有Token的计数。
说明 | 原型 |
初始化 | void os_sem_init (OS_ID semaphore, U16 token_count ); |
Tokens计数器加1 | OS_RESULT os_sem_send (OS_ID semaphore ); |
Tokens计数器加1 | void isr_sem_send (OS_ID semaphore ); |
请求一个Token,如果Tokens的数量大于0,则将一个token给任务,并将Tokens的计数值减1,任务继续执行;如果Tokens的数量等于0,则任务等待直到有一个token可用或超时。 | OS_RESULT os_sem_wait (OS_ID semaphore, U16 timeout ); |