关键词不能为空

当前您在: 主页 > 英语 >

ZigBee的Z-Stack操作系统

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-03-03 12:49
tags:

-

2021年3月3日发(作者:threads)


Z-Stack


操作系统





学习


Zi gBee


有两个月了,


学习期间也走了不少弯路,


刚开始调试了几个


LED


小灯的实

< br>验,串口通信实验,


点对点通信实验,以为这样基本就差不多可以做定位系统了,


于是直接


跳到定位这一块,


实际上远没 有那么简单。


我想很多初学者都是打开协议栈就被左边那一列


给 镇住了,看到那么多代码都不知道从何入手,下面我重点介绍一下关于


ZigBee


协议栈操


作系统的原理,让更多初学者能看清


Z-Stack


操作系统(其实只是一个简单的小系统,看明


白了觉得也没有多复杂)的工作过程。



下面的图片是我根据书上的资料自己绘制出来的,从这个图中可以看到


Z-Stac k


的整个


系统的工作流程。



Z-Stack


操作系统





似乎这个对于初学者来说也看不出 什么道道来,


我在看代码的时候完全不知道从哪里看


起。


即使找到了主函数,


找到了


OSAL_sta rt_system()


也不知道他到底是怎么运行的。


首先我


们先好好看一些这个微操作系统的工作流程:在


ZMain


主函数当中,基本上都是一些初始


化函数,从中断、系统时钟、堆栈 等等到最后按键、液晶显示初始化,这个对于我们来说基


本上不用看,

< br>只需大致了解其功能即可,


就像在电脑上编程只需了解软件和底层硬件的接口


一样。在初始化函数执行完以后便进入了


osal_start_s ystem()


函数,开始


OSAL


操 作系统。


OSAL


操作系统里面有七个任务,

< br>该循环轮询查询每个任务是否有需要处理的事件,


如果有


则处理,没有则跳到下一个任务,这七个任务有不同的优先级,从图中可以看出


MAC< /p>


层拥


有最高的优先级,


MAC

< p>
层如果有任务,则下面的任务不会被处理。



< /p>


好了,


基本上对于该操作系统有了一个简单的了解以后,


我们再来结合代码看看代码到


底是怎么运行的。




先大致浏览一下协议栈的目录,可以看到有

< br>ZMain


文件夹(如下乳所示)


,这个应该就


是主函数,看了很多资料确定了确实是从这里开始运行的。





打开


ZM ain.c


,找到


ZSEG int main( void )


函数,函数内容如下:



ZSEG int main( void )


{





// 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




zmain_ram_init();




// Initialize board I/O




InitBoard( OB_COLD );




// Initialze HAL drivers




HalDriverInit();




// Initialize NV System




osal_nv_init( NULL );




// Determine the extended address




zmain_ext_addr();




// Initialize basic NV items




zgInit();




// Initialize the MAC




ZMacInit();


#ifndef NONWK




// Since the AF isn't a task, call it's 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 initialization




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



}


// main()



————来自百度文库,转载请注明出去




大致看一下,和上述图中的初始化基本上一样。功能描述都换 做了绿色字体以便查看,


这些英文不是很难,


大都可以看懂什么 意思我就不再标注了,


实在不懂可以看上边图片,


< p>
具体解释。




函数最后是




osal_start_system();


// No Return from here


开始


OSAL


操作系统,


并且标注


了这里没有返回,也就是说在< /p>


OSAL


操作系统里面会一直永无止境的执行下去知道系统停


止工作。那么


osal_start_system()

< p>
这个函数在哪呢?一般习惯好的话看程序就知道什么意思,


更何况是那么大 的一个公司,


在函数前面有一个


osal



我们就顺着


osal


找下去。


查看协议栈


会发现有一个


OSAL


文件夹,那么函数很有可能就在这里面。如下图:






OSA L


里面仔细查找可以找到这个函数,具体如下:



void osal_start_system( void )


{


#if !defined ( ZBIT )




for(;;)



// Forever Loop


#endif




{






uint8 idx = 0;






Hal_ProcessPoll();



// This replaces MT_SerialPoll() and osal_check_timer().






do {








if (tasksEvents[idx])



// Task is highest priority that is ready.








{










break;








}


} while (++idx < tasksCnt);


//


得到了待处理的具有最高优先级的任务索引号


idx






if (idx < tasksCnt)






//


确认本次有任务需要处理







{








uint16 events;








halIntState_t intState;


//


进入


/


退出临界区,来提取出需要处理的任 务中的事件









HAL_ENTER_CRITICAL_SECTION(intState);








events = tasksEvents[idx];








tasksEvents[idx] = 0;



// Clear the Events for this task.








HAL_EXIT_CRITICAL_SECTION(intState);

-


-


-


-


-


-


-


-



本文更新与2021-03-03 12:49,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/700063.html

ZigBee的Z-Stack操作系统的相关文章