平时我们在写单片机程序时候基本是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简单理解为设置要在while(1)里边运行的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就是这样的运行机制,简化了也没什么难理解的。
其他更深入的理解,需要自己去百度。“`