BLE 协议栈的各层都是以 OSAL 任务方式实现,由于 LL 控制室的时间要求最为迫切,所以其任务优先级最高。为了实现任务管理,OSAL 通过消息处理(messageprocess) ,存储管理,计时器定时等附加服务实现。下面结合代码进行分析
2.程序的流程分析
2.1 从main函数开始,这是函数的程序的入口
int main(void)
{
/* Initialize hardware */HAL_BOARD_INIT();//硬件的初始化,这里后面有分析,这里的初始化主要是对时钟的管理// Initialize board I/OInitBoard( OB_COLD );//初始化io,冷初始化有分析,第一次进入关中断,关闭所有的灯/* Initialze the HAL driver */HalDriverInit();//HAL层的初始化/* Initialize NV system */osal_snv_init();//NV系统的初始化,这个需要重点分析,后面会有文章分析这个东西/* Initialize LL *//* Initialize the operating system */osal_init_system();//这里很重要,初始化任务的地方,重要0001/* Enable interrupts */HAL_ENABLE_INTERRUPTS();//开中断// Final board initializationInitBoard( OB_READY );//再次board初始化,热#if defined ( POWER_SAVING )
osal_pwrmgr_device( PWRMGR_BATTERY );
#endif/* Start OSAL */osal_start_system(); // No Return from here开始任务轮询,不会返回,重要0002
return 0;
}
2.2 任务初始化函数,这里有我们的应用层任务初始化
uint8 osal_init_system( void )
{
// Initialize the Memory Allocation System
osal_mem_init();
// Initialize the message queue
osal_qHead = NULL;
// Initialize the timers
osalTimerInit();
// Initialize the Power Management System
osal_pwrmgr_init();
// Initialize the system tasks.
osalInitTasks();//这个是和我们的任务有关的初始化函数// Setup efficient search for the first free block of heap.
osal_mem_kick();
return ( SUCCESS );
}