CC2530 ZigBee协议栈 学习心得

最近一直在学习研究cc2530这款单片机,感受本身的C语言水平仍是不够有得提高的空间,但仍是有很多收获。
   CC2530是一款支持ZigBee无线组网协议的低功耗单片机,cc2530主要的应用场景是在物联网方面。由于有着无线组网和低功耗的优点因此被普遍使用物联网无线数据采集和控制。
   ZigBee协议栈,一听就应该明白,这是个像TCP/IP同样的复杂协议,其实否则单片机的RAM和ROM都是有限的,并且cc2530还有无线收发能力因此系统的资源很紧缺,通过个人钻研ZigBee协议的代码发现并不复杂,感受本身的C语言又进步了,理解了一些C语言的精髓。程序员

 

    我学习Texas Instruments公司ZStack-CC2530-2.5.0协议栈,这是个半开源的协议栈,有些核心代码是以库的形式提供的,因此协议栈是以软件形式安装在电脑上,安装后在C盘会有工程源码,开发的基本思路是借助IT提供的工程模板本身修改SampleApp的工程就好了。其实Zigbee协议栈规范和Z-Stack的关系也差很少,Z-Stack就是符合Zigbee协议栈规范的一个硬件和软件平台,是Zigbee协议栈的一个具体实现。Z-Stack的整个开发环境IDE使用的是IAR(IAR的版本须要参考Z-Stack Home Sample Application User's Guide。此文档在TI提供的资料包里\Documents内)。想详细了解IAR或者使用过程当中遇到什么问题请使用IAR的help选项。数组

    Z-Stack是分层设计的,主要分为物理层(PHY和MAC)、介质访问层(MAC)、网络层(NWK)、应用层(APS和ZDO、APL),还有一个OSAL操做系统抽象层。网络

    Z-Stack采用事件轮询式的操做系统,OSAL就是以实现多任务为核心的系统资源管理机制,提及来很叼,多任务管理。可是看到代码就会恍然大悟,实现原理很简单,从IAR工程里ZMian文件夹下面的ZMian.c文件中找到main()函数,而后跟随协议栈的初始化定义,最后会走到osal_start_system();里面有实现轮序代码,根据tasksEvents[]数组从低位到高位的优先级执行tasksArr[]数组的事件处理函数,而且还有消息队列用来接收无线的数据收发数据结构


Z-Stack采用基于一个轮转查询式操做系统,该操做系统命名为OSAL(Operating System Abstraction Layer),中文为“操做系统抽象层”。Z-Stack协议栈将底层、网络层等复杂部分屏蔽掉,让程序员经过API函数就能够轻松地开发一套ZigBee系统。ide

操做系统(Operating System,简称OS)看似很复杂,其实只要作几个实训项目,就会很快撑握整个OSAL的工做原理,首先了解一下几个关键的操做系统术语。函数

1. 资源(Resource)学习

任务所占用的实体均可以称为资源,如一个变量、数组、结构体等。测试

2. 共享资源(Shared Resource)ui

至少能够被两个任务使用的资源称为共享资源,为了防止共享资源被破坏,每一个任务在操做共享资源时,必须保证是独占该资源。操作系统

3. 任务(Task)

任务又称线程,是一个简单程序的执行过程。在任务设计时,须要将问题尽量地分为多个任务,每一个任务独立完成某种功能,同时被赋予必定的优先级,拥有本身的CPU寄存器和堆栈空间。通常将任务设计为一个无限循环。

4. 多任务运行(Muti-task Running)

CPU采用任务调度的方法运行多个任务,例如:有10个任务须要运行,每隔10ms运行一个任务,因为每一个任务运行的时间很短,任务切换很频繁,这就形成了多任务同时运行的“假象”。实际上,一个时间点只有一个任务在运行。

5. 内核(Kernel)

在多任务系统中,内核负责为每一个任务分配CPU时间、切换任务、任务间的通讯等。内核能够大大简化应用系统的程序设计,能够将应用程序分为若干个任务,经过任务切换来实现程序运行。

6. 互斥(Mutual Exclusion)

多任务间通讯的最简单方法是使用共享数据结构,对于单片机系统来讲,全部任务共用同一地址的数据,具体表现为全局变量、指针、缓冲区等数据结构。虽然共享数据结构的方法简单,可是必须保证对共享数据结构的写操做具备惟一性。

保护共享资源最经常使用的方法是:关中断、使用测试并置位指令(T&S指令)、禁止任务切换和使用信号量。其中,在ZigBee协议栈操做系统中,常用的方法是关中断。

7. 消息队列(Message Queue)

消息是收到的事件和数据的封装,好比发生了一个事件(收到别的节点发来的消息),这时就会把这个事件所对应的事件号及收到的数据封装成消息,放入消息队列中。

8. 事件(Events)

ZigBee协议栈是由各个层组成的,每一层都要处理各类事件,因此就为每一层定义了一个事件处理函数,能够把这个处理函数理解为任务,任务从消息队列中提取消息,从消息中提取所发生的具体事件,调用相应的具体事件处理函数,好比按键处理函数等等。

 Zigbee设备的分为Coordinator、Router、Enddevice三种角色,经过切换IAR上的标签能够实现tool目录下不一样的编译配置

未完。。。。