3. rtx任务间的通信--event flags

来源:互联网 发布:360彩票源码 编辑:程序博客网 时间:2024/04/30 18:46
2013-11-04 
--luoqindong
每个任务最多有16个事件标示,任务可以同时等待几个事件,或选择等待其中的某个或某些事件.事件可由其他任务或中断处理函数触发.
void os_evt_set (
    U16    event_flags,    /* Bit pattern of event flags to set */
    OS_TID task );         /* The task that the events apply to */
触发事件函数,
event_flags表示事件标示,一个事件占用一bit,event_flags为1的位对应的事件才被触发.
task表示等待事件的任务ID.


OS_RESULT os_evt_wait_or (
    U16 wait_flags,    /* Bit pattern of events to wait for */
    U16 timeout );     /* Length of time to wait for event */


返回值:
OS_R_EVT--At least one of the flags specified by wait_flags has been set. 
OS_R_TMO--The timeout has expired. 


该函数等待wait_flags指定的某个事件发生或超时后才返回,如果是因事件返回,返回时该函数会将导致该函数返回的事件标示清除.
,要想知道是哪个事件导致函数返回,可以通过os_get_evt函数获取。


返回OS_R_EVT表示等待的事件中至少有一个事件发生了。如果同时等待多个事件,如wait_flags=0x03,返回OS_R_EVT时可能是:
<1> 事件0发生了(0x01)
<2> 事件1发生了(0x02)
<3> 事件0,1同时发生了(0x03)


返回OS_R_TMO说明等待事件超时了, 0xffff表示无限等待。


U16 os_evt_get (void);
该函数返回导致os_evt_wait_or函数返回的事件,如果os_evt_wait_or因超时返回,该函数返回0.


OS_RESULT os_evt_wait_and (
    U16 wait_flags,    /* Bit pattern of events to wait for */
    U16 timeout );     /* Length of time to wait for event */
返回值:
OS_R_EVT--All the flags specified by wait_flags have been set. 
OS_R_TMO--The timeout has expired. 


该函数等待wait_flags指定的所有事件发生或超时后才返回,如果是因事件返回,返回时该函数会将wait_flags等待的事件标示清除.
参数timeout表示超时返回时间,单位为系统tick.


void os_evt_clr (
    U16    clear_flags,    /* Bit pattern of event flags to clear */
    OS_TID task );         /* The task that the events apply to */
清除事件函数,参数clear_flags表示要清除的事件(对应位为1),task为等待事件的任务ID.




void isr_evt_set (
    U16    event_flags,    /* Bit pattern of event flags to set */
    OS_TID task );         /* The task that the events apply to */
该函数只能在IRQ中调用,FIQ中不能调用(对arm7,arm9的MCU来说了),cortex-m3所有的中断处理函数都可以调用.
所以如果在中断很频繁的地方调用该函数,有可能导致其他的任务不能运行的情况,如果某个事件在中断处理函数触
发了两次,等待该事件的任务有可能只捕获到一次事件。
原创粉丝点击