概述
目前ZigBee开发主要用的是TI的CC2530。CC2530内部集成看增强型的51所以对于只学过51的小白入门不成问题。
本篇文章我只会介绍ZigBee的协议栈。
我们打开ZigBee协议栈后可以加看到这样的界面
上面的各个层的基础知识你们自己查去。
我们点开ZMain.c 熟悉一下ZigBee的协议栈的流程
main()函数主要就做两件事
一是系统初始化。二是开始执行函数osal_start_system(),进入查询式操作系统
int main( void )
{
osal_int_disable( INTS_ALL ); //关闭所有中断
HAL_BOARD_INIT(); //初始化系统时钟
zmain_vdd_check(); //检查芯片电压是否正常
InitBoard( OB_COLD ); //初始化I/O ,LED 、Timer 等
HalDriverInit(); //初始化芯片各硬件模块
osal_nv_init( NULL ); //初始化Flash 存储器
ZMacInit(); //初始化MAC 层
zmain_ext_addr(); //确定IEEE 64位地址
zgInit(); //初始化非易失变量
#ifndef NONWK //如果没有定义NONWK编译选项,则进行AF初始化
afInit();
#endif
osal_init_system(); //初始化操作系统
osal_int_enable( INTS_ALL ); //使能全部中断
InitBoard( OB_READY ); //最终板载初始化
zmain_dev_info(); //显示设备信息
#ifdef LCD_SUPPORTED //如果使用LCD_SUPPORTED编译选项,在LCD上显示设备的调试信息
zmain_lcd_init(); //初始化LCD
#endif
#ifdef WDT_IN_PM1 //如果定义了WDT_IN_PM1,则使能看门狗
WatchDogEnable( WDTIMX );
#endif
osal_start_system(); // 进入轮转查询式操作系统事件处理的死循环,不再返回主函数
return 0;
}
在main()的函数中只有两重要的函数需要留意。分别为
osal_init_system(); //初始化操作系统
osal_start_system(); //进入轮转查询式操作系统事件处理的死循环
首先我们来看看osal_init_system(); //初始化操作系统
uint8 osal_init_system( void )
{
// Initialize the Memory Allocation System
osal_mem_init();
// Initialize the message queue
osal_qHead = NULL;
// 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 ( SUCCESS );
}
在osal_init_system()的这个函数中 我们重点看的是
osalInitTasks(); //初始化系统任务
我们进入osalInitTasks();看看
void osalInitTasks( void ) //任务的初始化
{
uint8 taskID = 0;
// 分配内存,返回指向缓冲区的指针
//这两句代码为一个长度tasksCnt(任务的个数)的unit16数组taskEvents分配了内存空间并将其值初始化为零
//变量taskID初始值为0,每层初始化后其值加1,在每一层初始化过程中记录分配给他的taskID值
tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);
// 设置所分配的内存空间单元值为0
osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));
// 任务优先级由高向低依次排列,高优先级对应taskID 的值反而小
macTaskInit( taskID++ ); //macTaskInit(0) ,用户不需考虑
nwk_init( taskID++ ); //nwk_init(1),用户不需考虑
Hal_Init( taskID++ ); //Hal_Init(2) ,用户需考虑
#if defined( MT_TASK )
MT_TaskInit( taskID++ );
#endif
APS_Init( taskID++ ); //APS_Init(3) ,用户不需考虑
#if defined ( ZIGBEE_FRAGMENTATION )
APSF_Init( taskID++ );
#endif
ZDApp_Init( taskID++ ); //ZDApp_Init(4) ,用户需考虑
#if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )
ZDNwkMgr_Init( taskID++ );
#endif
//用户创建的任务
SampleApp_Init( taskID ); // SampleApp_Init _Init(5) ,用户需考虑
}
为什么我们要给每一层分配任务ID?
首先我们来看看ZigBee的系统
ZigBee的操作系统是轮转查询式的操作系统
下面是其流程图
系统开始运行后,就开始不断根据我们分配的taskID,从优先级高的层的任务优先处理。
优先级高的任务处理后,再次从新回到原点,重新查询,从优先级高的层的任务处理。如果优先级高的任务不需要处理,查询下一级的任务,如果任务没有处理,开始处理任务。处理结束后,回到起点,重新从最高优先级的层查询。
最后
以上就是雪白冬瓜为你收集整理的ZigBee协议栈浅显解读(一)的全部内容,希望文章能够帮你解决ZigBee协议栈浅显解读(一)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复