- 1、本文档共55页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
基于Z-Stack的串口通信.ppt
任务十一 基于Z-Stack的串口通信
目 录
实训目的
通过实训,掌握在IAR环境下Z-Stack的使用,了解Z-Stack的基本架构,学会在IAR环境下Z-Stack的应用层的开发,掌握在Z-Stack下的OSAL增加任务的方法,实现向串口发送数据,控制LED灯的亮灭与闪烁。
目 录
实训内容
在用户应用层任务处理函数SampleApp_ProcessEvent中实现每隔5秒向串口发送“Hello NEWLab!”;并增加一个应用层新任务,实现由PC端发送字符“1”和“2”控制ZigBee模块的LED2灯的开与关。
目 录
实训原理
Z-Stack采用基于一个轮转查询式操作系统,该操作系统命名为OSAL(Operating System Abstraction Layer),中文为“操作系统抽象层”。Z-Stack协议栈将底层、网络层等复杂部分屏蔽掉,让程序员通过API函数就可以轻松地开发一套ZigBee系统。
11. 1 OSAL术语介绍
操作系统(Operating System,简称OS)看似很复杂,其实只要做几个实训项目,就会很快撑握整个OSAL的工作原理,首先了解一下几个关键的操作系统术语。
实训原理
1. 资源(Resource)
任务任务所占用的实体都可以称为资源,如一个变量、数组、结构体等。
2. 共享资源(Shared Resource)
至少可以被两个任务使用的资源称为共享资源,为了防止共享资源被破坏,每个任务在操作共享资源时,必须保证是独占该资源。
3. 任务(Task)
任务又称线程,是一个简单的程序的执行过程。在任务设计
实训原理
时,需要将问题尽可能地分为多个任务,每个任务独立完成某种功能,同时被赋予一定的优先级,拥有自己的CPU寄存器和堆栈空间。一般将任务设计为一个无限循环。
4. 多任务运行(Muti-task Running)
CPU采用任务调度的方法运行多个任务,例如:有10个任务需要运行,每隔10ms运行一个任务,由于每个任务运行的时间很短,任务切换很频繁,这就造成了多任务同时运行的“假象”。实际上,一个时间点只有一个任务在运行。
实训原理
5. 内核(Kernel)
在多任务系统中,内核负责为每个任务分配CPU时间、切换任务、任务间的通信等。内核可以大大简化应用系统的程序设计,可以将应用程序分为若干个任务,通过任务切换来实现程序运行。
6. 互斥(Mutual Exclusion)
多任务间通信的最简单方法是使用共享数据结构,对于单片机系统来说,所有任务共用同一地址的数据,具体表现为全局变量、指针、缓冲区等数据结构。虽然共享数据结构的方法简单,但是必须保证对共享数据结构的写操作具有唯一性。
实训原理
保护共享资源最常用的方法是:关中断、使用测试并置位指令(TS指令)、禁止任务切换和使用信号量。其中,在ZigBee协议栈操作系统中,经常使用的方法是关中断。
7. 消息队列(Message Queue)
消息是收到的事件和数据的一个封装,比如发生了一个事件(收到别的节点发的消息),这时就会把这个事件所对应的事件号及收到的数据封装成消息,放入消息队列中。
实训原理
8. 事件(Events)
ZigBee协议栈是由各个层组成的,每一层都要处理各种事件,所以就为每一层定义了一个事件处理函数,可以把这个处理函数理解为任务,任务从消息队列中提取消息,从消息中提取所发生的具体事件,调用相应的具体事件处理函数,比如按键处理函数等等。
11. 2 OSAL运行机制
OSAL就是以实现多任务为核心的系统资源分配机制,主要提供任务注册、初始化和启动,任务间的同步、互斥,中断处理,存储器分配与管理等功能。
实训原理
图11.1 OSAL运行机制
实训原理
在ZigBee协议栈中,OSAL负责调度各个任务运行,如果有事件发生时,则会调用相应的事件处理函数进行处理。OSAL运行机制如图3.2.1所示。
那么,事件和任务的事件处理函数是如何建立关系呢?
首先,建立一个事件表,保存各个任务的对应的事件。
其次,建立一个函数表,保存各个任务事件处理函数的地址。
最后,将这两个表建立某种对应关系,当某一事件发生时,则查找函数表找到对应的事件处理函数。事件表与函数的关系如图11.2所示。
实训原理
图11.2 事件表和函数表的关系
实训原理
在ZigBee协议栈中,tasksCnt、tasksEvents和tasksArr三个变量非常重要,读者必须搞清楚它们的作用。
■ tasksCnt:该变量保存了任务的总数量。在OSAL_SampleApp.c中定义为:
const uint8 tasksCnt = sizeof( tasksArr ) / sizeof( tasksArr[0] );
说明:
①
文档评论(0)