OSAL初始化流程.docx

上传人:s9****2 文档编号:550329518 上传时间:2023-08-04 格式:DOCX 页数:6 大小:26.10KB
返回 下载 相关 举报
OSAL初始化流程.docx_第1页
第1页 / 共6页
OSAL初始化流程.docx_第2页
第2页 / 共6页
OSAL初始化流程.docx_第3页
第3页 / 共6页
OSAL初始化流程.docx_第4页
第4页 / 共6页
OSAL初始化流程.docx_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《OSAL初始化流程.docx》由会员分享,可在线阅读,更多相关《OSAL初始化流程.docx(6页珍藏版)》请在金锄头文库上搜索。

1、OSAL初始化流程我使用的协议栈版本及例子信息:ZigBee2006Texas InstrumentsZStack-1.4.3-1.2.1ProjectszstackSamplesSampleApp首先借用前人的一个说明:用户自己添加的应用任务程序在Zstack中的调用过程是:(1).main() 执行(在ZMain.c中)main() - osal_init_system() (2). osal_init_system()调用osalInitTasks(), (在OSAL.c中)osal_init_system() - osalInitTasks()(3). osalInitTasks()调

2、用SampleApp_Init() , (在OSAL_SampleApp.c中)osalInitTasks() - SampleApp_Init()在osalInitTasks()中实现了多个任务初始化的设置,其中macTaskInit( taskID+ )到ZDApp_Init( taskID+ )的几行代码表示对于几个系统运行初始化任务的调用,而用户自己实现的SampleApp_Init()在最后,这里taskID随着任务的增加也随之递增.所以用户自己实现的任务的初始化操作应该在osalInitTasks()中增加./-1、首先来看下主函数main()ZSEG int main( void

3、 ) /主函数的功能就是完成初始化任务,然后进入OSAL / Turn off interrupts /*关闭中断*/ osal_int_disable( INTS_ALL ); / Initialize HAL /*初始化硬件*/ HAL_BOARD_INIT(); / Make sure supply voltage is high enough to run /*电压检测,确保芯片能正常工作的电压*/ zmain_vdd_check(); / Initialize stack memory/*初始化stack存储区*/ zmain_ram_init(); / Initialize boa

4、rd I/O /*初始化板载IO*/ InitBoard( OB_COLD ); / Initialze HAL drivers /*初始化硬件驱动*/ HalDriverInit(); / Initialize NV System /*初始化NV系统*/ osal_nv_init( NULL ); / Determine the extended address /*确定扩展地址(64位IEEE/物理地址)*/ zmain_ext_addr(); / Initialize basic NV items /*初始化基本NV条目*/ zgInit(); / Initialize the MAC

5、/*初始化MAC*/ ZMacInit();#ifndef NONWK / Since the AF isnt a task, call its initialization routine afInit();#endif#ifdef LCD_SUPPORTED HalLcdInit();#endif / Initialize the operating system /*初始化操作系统*/ osal_init_system(); / Allow interrupts /*开启中断*/ osal_int_enable( INTS_ALL ); / Final board initializat

6、ion /*最终板载初始化*/ InitBoard( OB_READY ); /HalLcdInit(); / Display information about this device /*显示设备信息*/ zmain_dev_info(); /* Display the device info on the LCD */#ifdef LCD_SUPPORTED zmain_lcd_init();#endif osal_start_system(); / No Return from here 没有返回,即进入操作系统! 说明:初始化各软硬件后进入系统主循环函数。 这里重点是两个函数:系统初

7、始化函数 osal_init_system();系统主循环函数 osal_start_system(); 下面记录下个人个人对系统初始化流程和系统主循环流程的学习。这里先记录下系统初始化流程。/-2、系统初始化流程2.1osal_init_system()系统初始化函数byte osal_init_system( void ) / Initialize the Memory Allocation System /*初始化内存分配系统*/ osal_mem_init(); / Initialize the message queue /*初始化系统消息队列*/ osal_qHead = NULL

8、;#if defined( OSAL_TOTAL_MEM ) osal_msg_cnt = 0;#endif / 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

9、 of heap. osal_mem_kick(); return ( ZSUCCESS );说明:这里重点是初始化系统任务函数:osalInitTasks(); 下面进入系统任务的初始化:/-2.2 osalInitTasks(); 任务初始化函数void osalInitTasks( void ) uint8 taskID = 0;/osal_mem_alloc()为当前OSAL中的各任务分配存储空间(实际上是一个任务数组),函数返回指向任务缓冲/区的指针,因此tasksEvents指向该任务数组(任务队列).注意tasksEvents和后面谈到的tasksArr里的顺 /序是一一对应的,

10、tasksArr 中的第i个事件处理函数对应于tasksEvents中的第i个任务的事件. tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt); /osal_memset()把开辟的内存全部设置为0;sizeof( uint16 )是4个字节,即一个任务 /的长度(同样是uint16定义),乘以任务数量tasksCnt,即全部内存空间 osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt); /OSAL.c中定义 macTaskInit( task

11、ID+ ); /初始化各层任务 mac_taskID=0; nwk_init( taskID+ ); /nwk_taskID=1; Hal_Init( taskID+ ); /Hal_taskID=2;#if defined( MT_TASK ) MT_TaskInit( taskID+ ); /MT_taskID=3;(if defined)#endif APS_Init( taskID+ ); /APS_taskID=4; ZDApp_Init( taskID+ ); /ZDAPP_taskID=5; SampleApp_Init( taskID ); /SampleApp_taskID=

12、6;用户创建的任务说明:任务初始化,就是为系统的各个任务分配存储空间,当然,这个空间初始化时为全0(NULL),然后为各任务分配taskID;这里的顺序要注意.系统主循环函数里tasksEvents idx和tasksArr idx的idx与这里taskID是一一对应关系。后面再分析。指针数组tasksEvents 里面最终分别指向的是各任务存储空间指针数组tasksArr 里面最终分别指向的是各任务事件处理函数这两个指针数组里面各元素的顺序要一一对应,因为后面需要相应任务调用相应事件处理函数.对这两个数组的定义请参见后面.问题:对于osal_mem_alloc()这个函数返回的是一个指向任务

13、数组的指针,看前人分析的,我还没有去看这个函数。说明:那么这里重点是各任务的初始化,MAC层和NWK层的未开源看不到,先记录下用户自己添加的任务初始化函数SampleApp_Init( taskID );/-2.3 SampleApp_Init( taskID );用户应用任务初始化函数void SampleApp_Init( uint8 task_id ) SampleApp_TaskID = task_id; /osal分配的任务ID,这里为6,随着用户添加任务的增多而改变 SampleApp_NwkState = DEV_INIT; /设备状态设定为ZDO层中定义的初始化状态(无连接)/*初始化应用设备的网络类型,设备类型的改变都要产生一个事件ZDO_STATE_CHANGE,从字面理解为/ZDO状态发生了改变。所以在设备初始化的时候一定要把它初始化为什么状态都没有。那么它就要去检测/整个

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号