




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
转载 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()调用SampleApp_Init() , (在OSAL_SampleApp.c中)osalInitTasks() - SampleApp_Init()在osalInitTasks()中实现了多个任务初始化的设置,其中macTaskInit( taskID+ )到ZDApp_Init( taskID+ )的几行代码表示对于几个系统运行初始化任务的调用,而用户自己实现的SampleApp_Init()在最后,这里taskID随着任务的增加也随之递增.所以用户自己实现的任务的初始化操作应该在osalInitTasks()中增加./-1、首先来看下主函数main()ZSEG int main( void ) /主函数的功能就是完成初始化任务,然后进入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 board 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/*初始化MAC*/ZMacInit();#ifndef NONWK/ Since the AF isnt a task, call its initialization routineafInit();#endif#ifdef LCD_SUPPORTED HalLcdInit();#endif/ Initialize the operating system/*初始化操作系统*/osal_init_system();/ Allow interrupts/*开启中断*/osal_int_enable( INTS_ALL );/ Final board initialization/*最终板载初始化*/InitBoard( OB_READY );/HalLcdInit();/ Display information about this device/*显示设备信息*/zmain_dev_info();/* Display the device info on the LCD */#ifdef LCD_SUPPORTEDzmain_lcd_init();#endifosal_start_system(); / No Return from here 没有返回,即进入操作系统! 说明:初始化各软硬件后进入系统主循环函数。 这里重点是两个函数:系统初始化函数 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;#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 of heap.osal_mem_kick();return ( ZSUCCESS );说明:这里重点是初始化系统任务函数:osalInitTasks(); 下面进入系统任务的初始化:/- 2.2 osalInitTasks(); 任务初始化函数void osalInitTasks( void )uint8 taskID = 0; /osal_mem_alloc()为当前OSAL中的各任务分配存储空间(实际上是一个任务数组),函数返回指向任务缓冲 /区的指针,因此tasksEvents指向该任务数组(任务队列).注意tasksEvents和后面谈到的tasksArr里的顺/序是一一对应的, 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( taskID+ ); /初始化各层任务 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)#endifAPS_Init( taskID+ ); /APS_taskID=4;ZDApp_Init( taskID+ ); /ZDAPP_taskID=5;SampleApp_Init( taskID ); /SampleApp_taskID=6;用户创建的任务说明:任务初始化,就是为系统的各个任务分配存储空间,当然,这个空间初始化时为全0(NULL),然后为各任务分配taskID;这里的顺序要注意.系统主循环函数里tasksEvents idx和tasksArr idx的idx与这里taskID是一一对应关系。后面再分析。指针数组tasksEvents 里面最终分别指向的是各任务存储空间指针数组tasksArr 里面最终分别指向的是各任务事件处理函数这两个指针数组里面各元素的顺序要一一对应,因为后面需要相应任务调用相应事件处理函数.对这两个数组的定义请参见后面.问题:对于osal_mem_alloc()这个函数返回的是一个指向任务数组的指针,看前人分析的,我还没有去看这个函数。说明:那么这里重点是各任务的初始化,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状态发生了改变。所以在设备初始化的时候一定要把它初始化为什么状态都没有。那么它就要去检测/整个环境,看是否能重新建立或者加入存在的网络。但是有一种情况例外,就是当NV_RESTORE被设置的/时候(NV_RESTORE是把信息保存在非易失存储器中),那么当设备断电或者某种意外重启时,由于网络/状态存储在非易失存储器中,那么此时就只需要恢复其网络状态,而不需要重新建立或者加入网络了*/SampleApp_TransID = 0; /消息发送ID(多消息时有顺序之分)/ Device hardware initialization can be added here or in main() (Zmain.c)./ If the hardware is application specific - add it here./ If the hardware is other parts of the device add it in main().#if defined ( SOFT_START ) /如果选择了SOFT编译选项,则作为协调器启动/ The Demo target is setup to have SOFT_START and HOLD_AUTO_START/ SOFT_START is a compile option that allows the device to start/ as a coordinator if one isnt found./ We are looking at a jumper (defined in SampleAppHw.c) to be jumpered/ together - if they are - we will start up a coordinator. Otherwise,/ the device will start as a router./ if ( readCoordinatorJumper() ) zgDeviceLogicalType = ZG_DEVICETYPE_COORDINATOR; /else /zgDeviceLogicalType = ZG_DEVICETYPE_ROUTER;#endif / SOFT_START#if defined ( HOLD_AUTO_START ) /如果定义了HOLD_AUTO_START选项,则调用层的ZDOInitDevice,按照默认顺 /序网络中的第一个设备作为协调器,其他的设备作为子设备 / HOLD_AUTO_START is a compile option that will surpress ZDApp/ from starting the device and wait for the application to/ start the device.ZDOInitDevice(0);#endif/* 设置发送数据的方式和目的地址寻址模式*/-/周期消息,广播发送/ Setup for the periodic messages destination address 周期消息事件/ Broadcast to everyone/*广播到所有设备*/SampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast ; /发送模式(广播)SampleApp_Periodic_DstAddr.endPoint = SAMPLEAPP_ENDPOINT; /指定端点号EP20SampleApp_Periodic_DstAddr.addr.shortAddr = 0xFFFF; /指定目的网络地址为广播地址/*单播到一个设备*/* WXL_SampleApp_Single_DstAddr.addrMode = (afAddrMode_t)Addr16Bit; WXL_SampleApp_Single_DstAddr.endPoint = WXL_SAMPLEAPP_ENDPOINT;*/-/闪烁消息:发送到组 / Setup for the flash commands destination address - Group1 闪烁消息事件/*设置 endpoint description.*/SampleApp_Flash_DstAddr.addrMode = (afAddrMode_t)afAddrGroup; /(组寻址)SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT; /EP20SampleApp_Flash_DstAddr.addr.shortAddr = SAMPLEAPP_FLASH_GROUP; /组号0x0003/-/ Fill out the endpoint description./*定义本设备用来通信的APS层端点描述符*/SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT; /SampleApp EP描述符的EP号:20SampleApp_epDesc.task_id = &SampleApp_TaskID; /SampleApp EP描述符的任务ID:0SampleApp_epDesc.simpleDesc = (SimpleDescriptionFormat_t *)&SampleApp_SimpleDesc; /SampleApp EP简单描述符SampleApp_epDesc.latencyReq = noLatencyReqs; /延时策略/ Register the endpoint description with the AF/*向AF层登记EP描述符*/*登记endpoint description 到AF,要对该应用进行初始化并在AF进行登记,告诉应用层有这么一个EP已经开通可以使用,那么下层要是有关于该应用的信息或者应用要对下层做哪些操作,就自动得到下层的配合。*/afRegister( &SampleApp_epDesc );/ Register for all key events - This app will handle all key events/*登记所有的按键事件*/RegisterForKeys( SampleApp_TaskID ); / By default, all devices start out in Group 1 为闪烁消息配置的组/*设定一个新的组*/SampleApp_Group.ID =
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 豆类食品加工企业生产计划与调度考核试卷
- 肉类加工过程中的质量监控技术考核试卷
- 新生儿喂养指导要点
- 院前急救与护理要点解析
- 谊安呼吸机510临床操作与产品解析
- Guamecycline-生命科学试剂-MCE
- 单站闪电定位仪在哪些场景应用
- 新疆棉纺织产业发展现状与趋势调研报告
- 2025年下半年保险行业策略报告:新增负债成本显著下降板块兼具基本面及资金面催化
- 新能源汽车在城市公共交通中的应用与城市能源结构转型报告
- 夏季驾驶员安全培训
- 《纳税筹划(第7版)》课件 第7章 其他税种的纳税筹划
- 四川省南充市高坪区五年级下学期期末综合试题
- 儿童被忽视量表(CNS)
- 回购商铺方案
- 美制螺纹对照表
- B站营销生态与效果向营销资源组合【哔哩哔哩】【通案】【互联网】【社交媒体营销】
- 01-BUFR格式应用指南(试用版)
- 固定式升降机安全操作规程
- 辅酶Q10的基本生理作用课件
- 西方音乐史课后习题答案
评论
0/150
提交评论