ZigBee协议栈Z-Stack应用分析电子科学系系2008级电了信息科学与技术专业2班姓名胡健同组人姓名暂无指导老师罗中良日期2010年8月15日ZigBee协议栈Z-Stack的应用综述Z-Stack是TI公司提供的ZigBee协议栈,它从结构看与标准协议栈的组织结构很相似,所以我相信对于阅读过ZigBee协议栈的人来说,对Z-Stack应该不会陌牛,TI公司的Z-Stack在组织结构来看,为ZigBee协议部分的所谓的组(group)有Mac、nwk>profile>security>zdo,这些组包含了大部分ZigBee协议栈的内容,而且几乎都是一一对应的,并且在每一层都实现了访问接口函数,可以方便的查阅“・h”选择可用的服务函数。Z-Stack中的Hal则是ZigBee所说的Hal的超集,因为Z-Stack的Hal还包含了对应单片机的硬件抽彖,比如按键、LED、LCD、ADC、miTt等的抽象接口,提供的接口都是对用户透明的,应用起来比较方便,必要的初始化后可以育•接调用。Bpp是应用层,是添加应用的常规地方。用户的应用一般在这里添加。tools是Z-Stack与调试工具接口的代码。zmac是Mac的简单接口,也就是说,在ZigBee协议栈中看到的某些原语在这里可以找到对应的函数,不过,大部分的血ic原语的实现函数还是在血ic那个groupozmain是整个Z-Stack开始运行的地方,在这个组的源文件中可以找到主函数main与一些初始化函数。0SAL是协调协议栈、硬件、任务有条不紊工作的操作系统组(group),在这里实现一个消息驱动的实时操作系统,为其他任务提供服务,即提供必要的系统服务接口(API)。而ZigBee协议栈中的层在Z-Stack里面,都对应一个任务,而J4越底层任务优先级越高,这可以保证最紧急、实时要求高的层得以优先执行。OSAL.h函数列表如下byte*osal」iisg_dll()cate(uintl6len);//lbyteosaljnsg_deallocate(byte*msg_ptr)://2IJINT16osalnummsgs(void);//3byteosalmsgsend(bytedestinationtask,byte*msg_ptr);//4bytevoidexternexternexternexternexternexternexternexternbytevoidexternvoidexternvoidexternexternexternexternbytebytebytebytebyte*osaljnsg_receive(bytetask_id);//5osa1」nsg_enqueue(osal」nsg_q_t*q_ptr,void*msg_ptr);//6osaljnsg_enqueuejnax(osaljnsg_q__t*q_ptr,void*nisg_ptr,bytemax);/,/7*oscilmsgdequeue(osalmsg_q_t*q一ptr);//8osalmsgpush(osalmsgqt*qptr,void*msgptr);//9osal_msg__extract(osal_msg_q_t*q_ptr,void*msg_ptr,void*prev_ptr);//10osal__set_event(bytetask^id,U1NT16event_flag);//11osal_isr_register(byteinterrupt_id,void(*isr_ptr)(byte*));//12/osalintenable(byteinterruptid);//13osalintdisable(oscil___init_system(bytevoidextern#ifdefined(ZBIT)extern_dec1spec(d11export)#elseexternvoidosalstartsystem(void);#endifvoidinterruptid);//14);//15osal_start_system(void);//16那么,我们如何应用Z-Stack呢?如前而所述,协议栈的每层都是单独一组,并以文件为接口提供接口函数,OSAL也是如此一-我们就是应用这些的!也就是说,我们就是在这些服务接口的范围进行我们的应用开发的,Z-Stack给我们提供了一个应用的框架!下而,我以开发应用的角度来分析一下Z-Stack的可用接口。一.熟悉Z-Stack的操作系统第一步,观察可用的操作系统函数。在“・h”文件中找,看看有哪些“・h”文件及其对应函数。OSAL_Custom.h函数列表如下externvoidosalAddTasks(void);OSAL_Memory.h函数列表如下voidosalmeminit(void);externexternvoidosalmemkick(void);void*osalmemalloc(uintl6size);voidosalmemfree(void*ptr);#if(OSALMEMMETRICS)uintl6osalheapblockmax(void);uint16uint16uint16#endifosalheapblockent(void);osalheapblockfree(void);osalheapmemused(void);#ifdefined(ZTOOLPl)丨defined(ZTOOLP2)uintl6osalheaphighwater(void);#endif0SAL_Nv.h函数列表如下externvoidosalnvinit(void*p);externbyteosalnviteminit(uintl6id,ui门tl6len,void*buf);externbyteosalnvread(ui门tl6id,uintl6offset,uint16len,void*buf);externbyteosalnvwrite(uintl6id,uintl6offset,uint.16len,void*buf);externuintl6osaln...