ZigBee——在CC2530的ZStack中添加定时任务
在使用CC2530芯片进行ZigBee协议的开发时,我们往往使用TI公司提供的带有ZigBee协议栈的ZStack工程,接下来以其中的SampleApp为例,向其中添加自己需要的定时任务并设置周期和处理流程。
首先,我们以SampleApp中的默认定时任务
SAMPLEAPP_SEND_PERIODIC_MSG_EVT
作为参考,通过IAR软件找到其在SampleApp.h头文件中被定义,并在SampleApp.c中多次被使用,由于该文件就是用户程序运行的主要区域,因此着重分析其在这两个文件中的分布及起到的作用。
以下是对该任务的分析:
// Send Message Timeout
#define SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT 1000 // Every 1 seconds// Application Events (OSAL) - These are bit weighted definitions.(**注意二进制表达**)
#define SAMPLEAPP_SEND_PERIODIC_MSG_EVT 0x0001
在SampleApp.c中的SampleApp_ProcessEvent函数中,第一次用到了该任务。此函数用于处理系统所产生的一些事件和消息。在系统事件ZDO_STATE_CHANGE(网络状态)的处理支路中,使用osal_start_timerEx函数开启了此定时器,具体代码如下:
osal_start_timerEx(SampleApp_TaskID,
SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT);
代码中使用了SampleApp的TaskID,表明该定时器所产生的消息将交由SampleApp中专门负责处理消息的回调函数SampleApp_ProcessEvent进行处理,产生消息时将会传入SAMPLEAPP_SEND_PERIODIC_MSG_EVT的事件信息,并将该定时器超时时间设置为SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT所定义的值。
随后,在SampleApp_ProcessEvent函数中的events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT支路对此任务设置的消息进行处理,从处理的方式可以看到进行了位与运算,即判断events中该事件ID所在的位是否与设定值一致,若一致则进行处理,因此消息ID必须放置在二进制的“bit”中。
在事件处理结束后,通过return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT)返回了处理的结果,即清除了该事件所在的位,并保留其它位留待后续处理。
接下来我们添加两个自定义的定时任务:
#define SAMPLEAPP_SEND_INFO_MSG_EVT 0x0002
#define SAMPLEAPP_LED_RUN_EVT 0x0004#define SAMPLEAPP_SEND_INFO_MSG_TIMEOUT 10000 // Every 10 seconds
#define SAMPLEAPP_LED_RUN_TIMEOUT 500 // Every 0.5 seconds
分别用于状态信息的发送和LED运行状态的指示。
首先,在SampleApp.h中添加上述宏定义,随后,在SampleApp.c中的SampleApp_Init函数中添加以下初始化定时器的相关函数:
osal_start_timerEx(SampleApp_TaskID,
SAMPLEAPP_SEND_INFO_MSG_EVT,
SAMPLEAPP_SEND_INFO_MSG_TIMEOUT);
osal_start_timerEx(SampleApp_TaskID,
SAMPLEAPP_LED_RUN_EVT,
SAMPLEAPP_LED_RUN_TIMEOUT);
最后,参考已有的定时器用法,在SampleApp_ProcessEvent函数中添加对应的事件处理流程:
if (events & SAMPLEAPP_SEND_INFO_MSG_EVT){// Setup to send message again in normal infoosal_start_timerEx(SampleApp_TaskID, SAMPLEAPP_SEND_INFO_MSG_EVT,(SAMPLEAPP_SEND_INFO_MSG_TIMEOUT));//do something// return unprocessed events 返回未处理的事件return (events ^ SAMPLEAPP_SEND_INFO_MSG_EVT);}if (events & SAMPLEAPP_LED_RUN_EVT){// Setup to led event againosal_start_timerEx(SampleApp_TaskID, SAMPLEAPP_LED_RUN_EVT,(SAMPLEAPP_LED_RUN_TIMEOUT));//do something// return unprocessed events 返回未处理的事件return (events ^ SAMPLEAPP_LED_RUN_EVT);}
值得注意的是,由于OSAL中采用按位设置标志位的方式进行事件的处理,因此设置事件时就需要留意事件ID的选取,必须设置为2的整数次幂,如0x01、0x02、0x04、0x08等,不可设置为0x03或其它非2的整数次幂的值,否则将会导致多个事件同时命中。相对地,我们也可以利用这一特性,通过设置一个全为“1”的事件ID来响应发生的所有事件或使所有事件的处理流程对此做出响应。
总之,OSAL系统为我们所编写的用户程序提供了一个完善而稳定的运行环境,对于它的使用,TI官方所给的示例及注释已十分完备,通过阅读代码,对用户程序进行修改也能够帮助我们对ZigBee和CC2530的使用有更加深入的理解。
ZigBee——在CC2530的ZStack中添加定时任务相关推荐
- 解决CC2530在zstack中无法进入P0中断的问题
解决CC2530在zstack中无法进入P0中断的问题 最近使用CC2530控制一个超声波模块,需要使用外部中断P0接收数据,定时器来计时.裸机程序没有问题,移植进入ZSTACK的时候无法进入中断P0 ...
- 用crontab、crond在嵌入式系统中添加定时任务
在嵌入式系统中,定时任务通过crond和cronttab两个系统命令来联合执行. 其中crond是定时任务的守护进程,系统开始时是没有开启的.crontab主要作用是管理用户的crontab file ...
- ZIGBEE(CC2530,ZSTACK)串口波特率自适应
在使用ZigBee进行数据透传的时候,我遇到了这样的情况:负责采集数据的两个单片机之间的波特率不相同,一个是38400,另一个是115200,但是负责传输数据的CC2530除了波特率之外,其它的代码都 ...
- linux添加定时任务报错 error renaming /var/spool/cron/#tmp.xxxxxxxx to /var/spool/
在给linux服务器添加定时任务的时候出现以下错误 文件格式问题 [root@xxxxxxbi2cZ ~]# crontab -e crontab: installing new crontab cr ...
- java定时执行sql语句_spring中使用quartz动态添加定时任务执行sql
系统用来每天插入视图数据... 一.数据库表设计 1.接口配置表(t_m_db_interface_config) 2.接口日志表(t_m_db_interface_log) 3.前端配置页面 查询页 ...
- 【Java之轨迹】SpringBoot 实现动态往数据库中添加时间点,使程序在规定的时间点执行任务(定时任务变形应用,附实战:动态日程提醒任务调度)
-- 目录 -- 1. 需求产生背景 2. 实现思路 3. 具体实现(实战) ① 示范建表(只想看逻辑的可以跳过) ② 自定义任务调度器(重 - 参考与改造) ② 自定义装载任务(重 - 初始化任务调 ...
- android中的定时任务一般有两种机制,android 定时任务
使用timertask进行定时任务 首先创建TimerTask: class SynchroTimerTask extends TimerTask { @Override public void ru ...
- ZStack中的编程技巧
1. 像函数一样使用的宏 //这个宏,用来被其他宏使用,构造一个正确有效的表达式.这个适合于一些离散语句的组合,不适合函数的重新命名 #define st(x) do { x } while ...
- 使用PHP往Windows系统中添加用户
可以实现, 方法有二. 一.再Web中添加用户 因为添加用户,所以你运行PHP程序的用户必须是管理员权限(Administrator),并且同时需要你的php.ini中的安全模式没有打开,并且关闭函数 ...
最新文章
- 一套代码小程序WebNative运行的探索02
- 储能系统进入数据中心是大势所趋
- NSURLSession的应用
- memory拷贝与string拷贝的区别
- 的文件夹结构_小白指南:WordPress文件及目录结构解析
- JDK1.8下载与安装及环境变量配置
- 「CodePlus 2017 11 月赛」Yazid 的新生舞会(树状数组/线段树)
- Vue人资中台--打包上线
- python实现画樱花树
- God.org单域环境攻略(二)
- windows下tomcat7日志配置
- oracle正则表达式匹配字母,oracle正则表达式函数 匹配
- screen和scp
- 一篇文章带你快速了解荧光蛋白
- TF卡格式化了怎么办?tf卡数据恢复,看这3个方法
- 跳跃游戏 (动态规划剪枝/前缀和/滑动窗口/BFS剪枝)
- px和毫米的换算_js转换px与mm, cm
- 桌面任务栏不见了解决办法
- 王宝强离婚成了谁的狂欢|严肃解读数据背后的媒体传播路径
- 20210829-基于CentOS7/Linux配置ssh免密登录
热门文章
- 异常:Incorrect result size: expected 1, actual 0
- r语言alasso的系数怎么看_R语言用msgps包做adaptive lasso,系数怎么提取啊?
- 2022 GopherChina 想听什么由你做主!
- 11. Container With Most Wate
- max2104打开时提醒注册插件出错_启动3dmax时出现插件程序集加载错误怎么办?
- 关于naked (C++)
- 彻底解决WPS右键没有新建文件的问题
- Properties 文件中字符串加了引号
- ios CAShapeLayer
- 【云服务器 ECS 实战】一文掌握弹性伸缩服务原理及配置方法