OSAL的main函数在zmain.c文件中定义,(本文以TI官方例程GenericApp为例)原型如下:
int main( void )
{
osal_int_disable( INTS_ALL );
HAL_BOARD_INIT();
zmain_vdd_check();
InitBoard( OB_COLD );
HalDriverInit();
osal_nv_init( NULL );
ZMacInit();
zmain_ext_addr();
zgInit();
#ifndef NONWK
// Since the AF isn't a task, call it's initialization routine
afInit();
#endif
// Initialize the operating system
osal_init_system();
osal_int_enable( INTS_ALL );
// Final board initialization
InitBoard( OB_READY );
zmain_dev_info();
#ifdef LCD_SUPPORTED
zmain_lcd_init();
#endif
#ifdef WDT_IN_PM1
/* If WDT is used, this is a good place to enable it. */
WatchDogEnable( WDTIMX );
#endif
osal_start_system(); // No Return from here
return 0; // Shouldn't get here.
} // main()
主函数开始所调用的函数大都是对系统的初始化工作,这里只做简单介绍:
osal_int_disable( INTS_ALL );关闭中断
HAL_BOARD_INIT();初始化和底板有关的东西比如led灯
zmain_vdd_check();检查电压值
InitBoard( OB_COLD );对底板的初始化,主要是按键
HalDriverInit();物理层驱动初始化
osal_nv_init( NULL );初始化非易失变量系统
ZMacInit();媒体层初始化
zgInit();初始化基本nv条目
osal_int_enable( INTS_ALL );开启中断
其中对于任务调度十分重要的函数是osal_init_system()和osal_start_system()。在上述代码中用蓝色字体标出。
osal_init_system()的作用是初始化操作系统,其原型是:
1. uint8 osal_init_system( void )
2. {
3. // 内存管理系统初始化
4. osal_mem_init();
5. // 初始化消息队列
6. osal_qHead = NULL;
7. // 定时器初始化
8. osalTimerInit();
9. // 电源管理初始化
10. osal_pwrmgr_init();
11. // 初始化任务调度系统
12. osalInitTasks();
13. // 有关堆内存的设置
14. osal_mem_kick();
15. return ( SUCCESS );
16. }
以上代码中关于任务调度的函数osalInitTasks()在OSAL_GenericApp.c文件中定义,这是我们写程序zigbee应用程序第一个需要修改的地方。其定义如下:
1. void osalInitTasks( void )
2. {
3. uint8 taskID = 0;
4. tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);
5. osal_memset( tasksEvents, 0, (sizeof(