欢迎来到天天文库
浏览记录
ID:6155181
大小:146.00 KB
页数:7页
时间:2018-01-04
《z-stack软件构架分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Z-Stack软件架构分析 Z-Stack的main函数在Zmain.c中,总体上来说,它一共做了两件工作,一个是系统初始化,即有启动代码来初始化硬件系统和软件架构需要的各个模块,另一个作用就是开福寺执行操作系统实体。1.系统初始化 系统启动代码需要完成初始化硬件平台和软件架构所需要的各个模块,为操作系统的运行做好准备工作,主要分为初始化系统时钟,检测芯片工作电压、初始化堆栈、初始化各个硬件模块、初始化FLASH存储、形成芯片MAC地址、初始化非易失量、初始化MAC层协议、初始化化应用帧层协议、初始化操作系统等十余部分,其具体流程图和对应的函数如下:
2、 图1系统初始化流程图2.操作系统的执行 启动代码为操作系统的执行做好准备工作后,就开始执行操作系统入口程序,并由此彻底将控制权移交给操作系统。其实,操作系统实体只有一行代码:Osal_start_system();//NoReturnfromhere 在这句话后面有一条注释,意思是本函数不会返回,也就是说它是一个死循环,永远不可能执行完。这个函数就是osal系统轮转查询操作的主体部分,它所做的工
3、作就是不断的查询每个任务中是否有事件发生,如果有事件发生,就调用相应的事件处理函数,如果没有任何事件发生就一直查询。我们可以看到下面就是这个函数的实现,其实这个函数的就是在一个无限的循环中。voidosal_start_system(void){#if!defined(ZBIT) for(;;)//ForeverLoop#endif { uint8idx=0; Hal_ProcessPoll();//ThisreplacesMT_SerialPoll()andosal_check_timer(). do{ if(tasksEvents[i
4、dx])//最高优先级任务被找到 { break; } }while(++idx5、XIT_CRITICAL(); HAL_ENTER_CRITICAL_SECTION(intState); events=tasksEvents[idx]; tasksEvents[idx]=0;//CleartheEventsforthistask. HAL_EXIT_CRITICAL_SECTION(intState);//通过指针调用来执行对应的任务处理函数 events=(tasksArr[idx])(idx,events); //进入/退出临界区,保存尚未处理的事件 HAL_ENTER_6、CRITICAL_SECTION(intState); tasksEvents[idx]7、=events;//Addbackunprocessedeventstothecurrenttask. HAL_EXIT_CRITICAL_SECTION(intState); }//本次事件处理结束,#ifdefined(POWER_SAVING) else//所有的任务事件都被查询结束后,没有任何事件被激活 { osal_pwrmgr_powerconserve();//系统进入休眠状态。 }#endif 8、}}操作系统专门分配了存放所有任务事件的tasksEvents[]数组,每一个单元对应存放着每一个任务的所有事件,在这个函数中首先通过一个do—while循环来遍历tasksEvents[],找到一个具有待处理事件的优先级最高的任务,序号低的任务优先级高,然后跳出循环,此时,就得到了最高优先级任务的序号idx,然后通过events=tasksEvents[idx]语句,将这个当前具有最高优先级的任务的事件取出,接着就调用(tasksArr[idx])(inx,events)函数来执行具体的处理函数了,taskArr[]是一个函数指针数组,
5、XIT_CRITICAL(); HAL_ENTER_CRITICAL_SECTION(intState); events=tasksEvents[idx]; tasksEvents[idx]=0;//CleartheEventsforthistask. HAL_EXIT_CRITICAL_SECTION(intState);//通过指针调用来执行对应的任务处理函数 events=(tasksArr[idx])(idx,events); //进入/退出临界区,保存尚未处理的事件 HAL_ENTER_
6、CRITICAL_SECTION(intState); tasksEvents[idx]
7、=events;//Addbackunprocessedeventstothecurrenttask. HAL_EXIT_CRITICAL_SECTION(intState); }//本次事件处理结束,#ifdefined(POWER_SAVING) else//所有的任务事件都被查询结束后,没有任何事件被激活 { osal_pwrmgr_powerconserve();//系统进入休眠状态。 }#endif
8、}}操作系统专门分配了存放所有任务事件的tasksEvents[]数组,每一个单元对应存放着每一个任务的所有事件,在这个函数中首先通过一个do—while循环来遍历tasksEvents[],找到一个具有待处理事件的优先级最高的任务,序号低的任务优先级高,然后跳出循环,此时,就得到了最高优先级任务的序号idx,然后通过events=tasksEvents[idx]语句,将这个当前具有最高优先级的任务的事件取出,接着就调用(tasksArr[idx])(inx,events)函数来执行具体的处理函数了,taskArr[]是一个函数指针数组,
此文档下载收益归作者所有