1、通过设置一个“软件定时器”,当其溢出时触发事件。osal_start_timerEx()—osalTimerUpdate()— osal_set_event()
2、通过调用系统消息传递机制触发事件。osal_msg_send()—osal_set_event()
3、直接调用osal_set_event()触发事件。
前面两种方式其实是间接调用了osal_set_event(),协议中很多应用都是通过前面两种方式来触发。
在协议栈里面,调用osal_set_event()的函数最主要是两个:
(1)osalTimerUpdate()
(2)osal_msg_send()
对于1,当有osal_start_timerEx()在系统软件定时器链表中添加一个软件定时器并启动时,系统通过osalTimerUpdate()对链表中的每一个软件定时器进行减1ms操作(具体参见有关于系统时钟的记录),当定时器溢出时,调用osal_set_event()触发事件,如下
/************************
static void osalTimerUpdate( uint16 updateTime )
{
// When timeout, execute the task
if ( srchTimer->timeout == 0 )
{
osal_set_event( srchTimer->task_id, srchTimer->event_flag );
}
}
/************************
对于2,对msg_ptr一系列处理后,调用osal_set_event()触发事件,如下
/************************
byte osal_msg_send( byte destination_task, byte *msg_ptr )
{
osal_set_event( destination_task, SYS_EVENT_MSG );
return ( ZSUCCESS );
}