osal_start_system运行操作系统函数

/*********************************************************************
 * @fn      osal_start_system
 *
 * @brief
 *
 *   This function is the main loop function of the task system.  It
 *   will look through all task events and call the task_event_processor()
 *   function for the task with the event.  If there are no events (for
 *   all tasks), this function puts the processor into Sleep.
 *   This Function doesn't return.
 *
 * @param   void
 *
 * @return  none

 */

注解:这个是任务系统轮询的主要函数。他会查找发生的事件然后调用相应的事件执行函数。如果没有事件登记要发生,那么就进入睡眠模式。这个函数是永远不会返回的。

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
  }
}



猜你喜欢

转载自blog.csdn.net/zhuix7788/article/details/12172305
今日推荐