*/
注解:这个是任务系统轮询的主要函数。他会查找发生的事件然后调用相应的事件执行函数。如果没有事件登记要发生,那么就进入睡眠模式。这个函数是永远不会返回的。
[cpp] view plain copy void osal_start_system( void ) { #if !defined ( ZBIT ) && !defined ( UBIT ) for(;;) // Forever Loop #endif { uint8 idx = 0; osalTimeUpdate(); //扫描哪个事件被触发了,然后置相应的标志位 Hal_ProcessPoll(); // This replaces MT_SerialPoll() and osal_check_timer(). do { if (tasksEvents[idx]) // Task is highest priority that is ready. { break; //得到待处理的最高优先级任务索引号 idx } } while (++idx < tasksCnt); if (idx < tasksCnt) { uint16 events; halIntState_t intState; HAL_ENTER_CRITICAL_SECTION(intState); //进入临界区,保护 events = tasksEvents[idx]; //提取需要处理的任务中的事件 tasksEvents[idx] = 0; // Clear the Events for this task.清除本次任务的事件 HAL_EXIT_CRITICAL_SECTION(intState); //退出临界区 events = (tasksArr[idx])( idx, events ); ///通过指针调用任务处理函数,关键 HAL_ENTER_CRITICAL_SECTION(intState); ///进入临界区 tasksEvents[idx] |= events; // Add back unprocessed events to the current task.保存未处理的事件 HAL_EXIT_CRITICAL_SECTION(intState); //退出临界区 } #if defined( POWER_SAVING ) else // Complete pass through all task events with no activity? { osal_pwrmgr_powerconserve(); // Put the processor/system into sleep } #endif } }
