受限于单片机的RAM和ROM大小的限制,任何适用于物联网设备的协议虽然复杂,但并不会过于复杂。
Z-Stack
Z-Stack是符合Zigbee协议栈规范的一个硬件和软件平台,是Zigbee协议栈的一个具体实现。
Z-Stack 是分层的,由下列层次组成:
- 物理层(PHY和MAC)
- 介质访问层(MAC)
- 网络层(NWK)
- 应用层(APS和ZDO、APL)
- OSAL操作系统抽象层
Z-Stack采用基于一个轮转查询式操作系统,该操作系统命名为OSAL(Operating System Abstraction Layer),中文为“操作系统抽象层”。Z-Stack协议栈将底层、网络层等复杂部分屏蔽掉,让程序员通过API函数就可以轻松地开发一套ZigBee系统。
操作系统(Operating System,简称OS)看似很复杂,其实只要做几个实训项目,就会很快撑握整个OSAL的工作原理,首先了解一下几个关键的操作系统术语。
- 资源(Resource)
任务所占用的实体都可以称为资源,如一个变量、数组、结构体等。
- 共享资源(Shared Resource)
至少可以被两个任务使用的资源称为共享资源,为了防止共享资源被破坏,每个任务在操作共享资源时,必须保证是独占该资源。
- 任务(Task)
任务又称线程,是一个简单程序的执行过程。在任务设计时,需要将问题尽可能地分为多个任务,每个任务独立完成某种功能,同时被赋予一定的优先级,拥有自己的CPU寄存器和堆栈空间。一般将任务设计为一个无限循环。
- 多任务运行(Muti-task Running)
CPU采用任务调度的方法运行多个任务,例如:有10个任务需要运行,每隔10ms运行一个任务,由于每个任务运行的时间很短,任务切换很频繁,这就造成了多任务同时运行的“假象”。实际上,一个时间点只有一个任务在运行。
- 内核(Kernel)
在多任务系统中,内核负责为每个任务分配CPU时间、切换任务、任务间的通信等。内核可以大大简化应用系统的程序设计,可以将应用程序分为若干个任务,通过任务切换来实现程序运行。
- 互斥(Mutual Exclusion)
多任务间通信的最简单方法是使用共享数据结构,对于单片机系统来说,所有任务共用同一地址的数据,具体表现为全局变量、指针、缓冲区等数据结构。虽然共享数据结构的方法简单,但是必须保证对共享数据结构的写操作具有唯一性。
保护共享资源最常用的方法是:关中断、使用测试并置位指令(T&S指令)、禁止任务切换和使用信号量。其中,在ZigBee协议栈操作系统中,经常使用的方法是关中断。
- 消息队列(Message Queue)
消息是收到的事件和数据的封装,比如发生了一个事件(收到别的节点发来的消息),这时就会把这个事件所对应的事件号及收到的数据封装成消息,放入消息队列中。
- 事件(Events)
ZigBee协议栈是由各个层组成的,每一层都要处理各种事件,所以就为每一层定义了一个事件处理函数,可以把这个处理函数理解为任务,任务从消息队列中提取消息,从消息中提取所发生的具体事件,调用相应的具体事件处理函数,比如按键处理函数等等。
Zigbee设备的分为Coordinator、Router、Enddevice三种角色,通过切换IAR上的标签可以实现tool目录下不同的编译配置。
我们以SensorDemo工程为例,SensorDemo工程是TI为Z-Sensor Monitor设计的一个不同于GenericApp、SampleApp和SimpleApp的工程,用它我们可以方便的观察到Zigbee网络的数据走向以及协议栈定时器任务的使用。当我们选择工程Coordinator、Router、Enddevice三种角色时,对应的tools目录下配置文件会变,同事会对应设置编译不同的文件,这样实现不同角色的功能不一样。但是他们都是依靠sapi出来的。
z-stack的设计不光是接收发送 无线和串口的数据,更多的强大的功能在于它的组网和定时器上。时钟是一个系统确定时间的基准,不管是单片机RTOS 、嵌入式系统、还是桌面电脑系统,内部都有一个精确的时钟来管理它们的每个任务