基于TI样例快速开发Zstack协议栈应用层
本文基于TI GenericApp样例 梳理样例应用层函数,学习协议栈和相关编程思路。
知识储备
- C语言基础(包括回调函数、静态变量、指针、结构体以及一些很基础的概念)
- 初步程序设计思想(过程设计,模块化设计,代码复用,自顶向下)
- Zstack,OSAL的基本运作机制(轮询机制等概念,有个流程图)
- 如果对后面文章哪一处有疑问,建议问问神奇的海螺
本文关注要点
- 协议栈与单片机裸机编程,在编程上的区别
- 应用层的应用是如何在协议栈和osal中工作的
- GenericApp中,TI样例函数之间的关系
- C语言编程通用技巧
协议栈与单片机裸机编程(有初步程序设计概念的可以直接跳过)
平时无论是最原始的51亦或是其他单片机,学习之初是 了解硬件底层寄存器+在IDE中直接操作相关寄存器 来完成基础功能,比如点个灯,点个流水灯,LCD俄罗斯方块等。基本流程就是自己定一个主函数,利用一些编程技巧就可以实现一定的功能。而Zstack协议栈,则是一下跨越到了系统层级的编程,跨度很大,如果不找到一个合理的切入口去解构协议栈,那建议放弃治疗。
说到切入口,根据协议的层级区分(zigbee网络结构),我们能够轻易介入的肯定是最上层的应用层。像Zstack一样的成熟协议栈,会做两件事方便使用者快速开发应用层
提供底层封装好的,多样的函数和宏定义(比如串口读写函数、按键函数等)。这里体现到一个模块化设计和代码复用的思想,以往裸机编程反复编写的针对寄存器和其余底层配置的操作和一系列操作的组合功能,被封装成宏参数和函数,分布在底层C文件中等待调用。
这样做一来 方便阅读和编写,二来 提高代码复用 的效率(划重点!!)。在应用层看来,就直接变成了,调用多个功能函数+逻辑来进一步组合完成目标,同时也无需关心底层的实现,无线的传输等功能了。其实不仅是这个协议栈,这样逐步模块化,积累的过程,在任何上规模的程序中都是必须的。(STM32 之所以方便,就是因为公司提供了完备的功能函数)提供基础样例,方便用户极快的了解应用层相关函数的使用,同时也作为开发模板。在GenericApp中,基础的功能是两个模块完成组网绑定,互传字符串hello world并显示在LCD上。
由此可见,编程观念要转换,从事无巨细的底层功能实现中解放出来,善于利用现成函数,完成更大规模的逻辑。关注点从操作寄存器—>利用函数(学过STM32或者熟悉编程的很容易迁移概念)。同样,在利用底层函数的同时,我们也可以进一步利用编程技巧和思想,封装我们自己编写的功能,松耦合紧内聚,提高复用率。
针对于Zstack来说,要初步改造或者添加内容,就必须了解添加改造部分与原有功能之间的联系。以添加应用为例,需要了解应用如何加入osal进行工作,如何调用底层来实现应用。样例给出了规范的高可扩展性的写法。
OSAL基础工作流程(以应用层为核心主线,其余流程作用请善用搜索引擎,嫌繁琐可以后跳到最后流程总结)
下图为Zstack 2.5.1为例子介绍工程文件内容(其余版本流程并无差别)
- 接下来选取的函数都是与创建应用紧密相关的函数,或者是直接需要改动的,或者是跟流程相关的。
- 重点关注目录ZMain 和App
OSAL系统,从ZMain目录下的ZMain.c 文件开始执行
/********************************************