先看main, 在文件Zmain.c里面
main
osal_init_system();
osalInitTasks();
... ...
SampleApp_Init( taskID ); // 用户定义的任务
osal_start_system();
步骤如下:
(1) 关掉中断 , osal_int_disable( INTS_ALL ); 其实就是EA = 0
(2)板级初始化 , HAL_BOARD_INIT(), 这里面首先把时钟从16M变为32MHz, 然后开启指令prefetch 模式,LED初始化
(3)zmain_vdd_check();检测电压
(4)InitBoard( OB_COLD ); Brown-Out reset
(5) HalDriverInit();初始化ADC, TIMER, LCD,UART等
(6)osal_nv_init( NULL ); 初始化flash相关
(7)ZMacInit();初始化mac , TI的mac相关源码并没有开放,而是提供库的形式
。。。
(8)osal_init_system();初始化操作系统OSAL
扫描二维码关注公众号,回复:
3942970 查看本文章
(9)osal_int_enable( INTS_ALL );打开中断
(10) zmain_dev_info();基本版本信息输出
(11)osal_start_system(); // No Return from here 系统执行
osal_start_system
osal_start_system是一个死循环,不会再返回。其主要代码如下
HAL_ENTER_CRITICAL_SECTION(intState); // 进入临界区
events = tasksEvents[idx]; // 优先级最高的events
tasksEvents[idx] = 0; // Clear the Events for this task.
HAL_EXIT_CRITICAL_SECTION(intState); // 退出临界区
activeTaskID = idx;
events = (tasksArr[idx])( idx, events ); // 执行
activeTaskID = TASK_NO_TASK;
上面tasksArr 定义如下 :
const pTaskEventHandlerFn tasksArr[] = {
macEventLoop, // mac 相关的event, 用户不要修改
nwk_event_loop, // nwk相关,用户不要修改
Hal_ProcessEvent,
#if defined( MT_TASK )
MT_ProcessEvent,
#endif
APS_event_loop, // APS 相关,用户不要修改
#if defined ( ZIGBEE_FRAGMENTATION )
APSF_ProcessEvent,
#endif
ZDApp_event_loop,
#if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )
ZDNwkMgr_event_loop,
#endif
SampleApp_ProcessEvent // 用户自定义的
};
注意:
osalInitTasks 和 tasksArr 定义的顺序是一致的, 比如用户定义的SampleApp_Init , 其任务SampleApp_ProcessEvent需要对应的唯一, 在osal_start_system调用时才会正确执行。