猜测:OS 系统按照任务的优先级从高到底不停的扫描这些任务,查看他们是否被设置了事件,
如果该任务被设置了事件,则操作系统将马上进入这个任务的 pFnEventProcessor(处理任
务函数)中执行程序员预先编制好的程序。高优先级的任务处理完成后必须取消该任务的事
件,否则处理器一直进入该高优先级的任务中,不能正常执行低优先级的任务。
实验目的:验证以上猜测是否正确
实验器材:zigbee 实验板一套 TI-MAC 程序(或者使用移植出来的 LTOS 以及 STC12C60S2
实验板)
实验步骤:
1:设置两个任务,TASK_LED1 和 TASK_LED2,TASK_LED1 的优先级低,TASK_LED2 的
优先级高。
void osalAddTasks( void )
{
/* HAL Drivers Task */
osalTaskAdd (Hal_Init, Hal_ProcessEvent, OSAL_TASK_PRIORITY_LOW);
/* MAC Task */
osalTaskAdd( LED1Init, LED1_ProcessEvent, OSAL_TASK_PRIORITY_MED );
/* Application Task */
osalTaskAdd( LED2Init, LED2_ProcessEvent, OSAL_TASK_PRIORITY_HIGH );
}
2:在任务 TASK_LED1 中为 TASK_LED2 设置开灯关灯事件,并且在 TASK_LED2 执行完
任务后清除事件标志。在任务 TASK_LED2 中为 TASK_LED1 设置开灯关灯事件,并且 TASK_LED1
执行完成后清除事件标志(注意程序中标 I 和 II 的语句)。运行结果:两小灯交替闪烁。
uint16 LED2_ProcessEvent(uint8 taskId, uint16 events)
{
if(events&LED_START_EVENT)
{
HalLedSet (HAL_LED_2, HAL_LED_MODE_ON);
delay(5000);
HalLedSet (HAL_LED_2, HAL_LED_MODE_OFF);
osal_start_timerEx(LED1Id,MSA_SEND_EVENT,100);
return (events ^ MSA_SEND_EVENT); (I)
}
return 0; (I)
}
uint16 LED1_ProcessEvent(uint8 taskId, uint16 events)
{
if(events & LED_START_EVENT)
{
HalLedSet (HAL_LED_1, HAL_LED_MODE_ON);
delay(5000);