解读OSAL流程

来源:互联网 发布:java 射击游戏 编辑:程序博客网 时间:2024/06/06 17:09

平时我们在写单片机程序时候基本是main方法里边对外设初始化,然后在while(1)里边写任务函数。OSAL也是这样的流程。我们首先找到main方法:

int main(void){  /* Initialize hardware */  HAL_BOARD_INIT();  // Initialize board I/O  InitBoard( OB_COLD );  /* Initialze the HAL driver */  HalDriverInit();  /* Initialize NV system */  osal_snv_init();  /* Initialize LL */  /* Initialize the operating system */  osal_init_system();  /* Enable interrupts */  HAL_ENABLE_INTERRUPTS();  // Final board initialization  InitBoard( OB_READY );  #if defined ( POWER_SAVING )    osal_pwrmgr_device( PWRMGR_BATTERY );  #endif  /* Start OSAL */  osal_start_system(); // No Return from here  return 0;}```对于芯片和外设的初始化我们可以不用理会。对于OSAL启动流程我们只需要理解osal_init_system( void )和osal_start_system();这两个函数就可以了。osal_init_system简单理解为设置要在while1)里边运行的task,osal_start_system就是while(1).在osal_init_system中osalInitTasks这个函数就是设置任务ID,ID1对应task1,ID2对应task2.在osal_run_system里边不断查询需要处理的任务。=====================================================```do {    if (tasksEvents[idx])  // Task is highest priority that is ready.    {      break;    }  } while (++idx < tasksCnt);

不断查询需要处理的任务。在这里我简化写一个类型方法。

unsigned char TaskArr[5];while(1){        if(TaskArr[0] == TaskFlag)        {                TaskArr[0] = 0;                 Task1();        }        else if(TaskArr[1] == TaskFlag)        {                TaskArr[1] = 0;                Task2();        }        //....}

======================================
因此,我们可以认为OSAL如下面所示:

“`
while(1)
{
if(events )
{
SimpleBLEPeripheral_ProcessEvent( task_id,events )
}
}

对于怎么进入这个函数,基本是由osal_msg_send和osal_start_timerEx设置Task 的events标志位决定。osla就是这样的运行机制,简化了也没什么难理解的。

其他更深入的理解,需要自己去百度。“`