在使用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中添加定时任务相关推荐

  1. 解决CC2530在zstack中无法进入P0中断的问题

    解决CC2530在zstack中无法进入P0中断的问题 最近使用CC2530控制一个超声波模块,需要使用外部中断P0接收数据,定时器来计时.裸机程序没有问题,移植进入ZSTACK的时候无法进入中断P0 ...

  2. 用crontab、crond在嵌入式系统中添加定时任务

    在嵌入式系统中,定时任务通过crond和cronttab两个系统命令来联合执行. 其中crond是定时任务的守护进程,系统开始时是没有开启的.crontab主要作用是管理用户的crontab file ...

  3. ZIGBEE(CC2530,ZSTACK)串口波特率自适应

    在使用ZigBee进行数据透传的时候,我遇到了这样的情况:负责采集数据的两个单片机之间的波特率不相同,一个是38400,另一个是115200,但是负责传输数据的CC2530除了波特率之外,其它的代码都 ...

  4. linux添加定时任务报错 error renaming /var/spool/cron/#tmp.xxxxxxxx to /var/spool/

    在给linux服务器添加定时任务的时候出现以下错误 文件格式问题 [root@xxxxxxbi2cZ ~]# crontab -e crontab: installing new crontab cr ...

  5. java定时执行sql语句_spring中使用quartz动态添加定时任务执行sql

    系统用来每天插入视图数据... 一.数据库表设计 1.接口配置表(t_m_db_interface_config) 2.接口日志表(t_m_db_interface_log) 3.前端配置页面 查询页 ...

  6. 【Java之轨迹】SpringBoot 实现动态往数据库中添加时间点,使程序在规定的时间点执行任务(定时任务变形应用,附实战:动态日程提醒任务调度)

    -- 目录 -- 1. 需求产生背景 2. 实现思路 3. 具体实现(实战) ① 示范建表(只想看逻辑的可以跳过) ② 自定义任务调度器(重 - 参考与改造) ② 自定义装载任务(重 - 初始化任务调 ...

  7. android中的定时任务一般有两种机制,android 定时任务

    使用timertask进行定时任务 首先创建TimerTask: class SynchroTimerTask extends TimerTask { @Override public void ru ...

  8. ZStack中的编程技巧

    1. 像函数一样使用的宏 //这个宏,用来被其他宏使用,构造一个正确有效的表达式.这个适合于一些离散语句的组合,不适合函数的重新命名 #define st(x)      do { x } while ...

  9. 使用PHP往Windows系统中添加用户

    可以实现, 方法有二. 一.再Web中添加用户 因为添加用户,所以你运行PHP程序的用户必须是管理员权限(Administrator),并且同时需要你的php.ini中的安全模式没有打开,并且关闭函数 ...

最新文章

  1. 一套代码小程序WebNative运行的探索02
  2. 储能系统进入数据中心是大势所趋
  3. NSURLSession的应用
  4. memory拷贝与string拷贝的区别
  5. 的文件夹结构_小白指南:WordPress文件及目录结构解析
  6. JDK1.8下载与安装及环境变量配置
  7. 「CodePlus 2017 11 月赛」Yazid 的新生舞会(树状数组/线段树)
  8. Vue人资中台--打包上线
  9. python实现画樱花树
  10. God.org单域环境攻略(二)
  11. windows下tomcat7日志配置
  12. oracle正则表达式匹配字母,oracle正则表达式函数 匹配
  13. screen和scp
  14. 一篇文章带你快速了解荧光蛋白
  15. TF卡格式化了怎么办?tf卡数据恢复,看这3个方法
  16. 跳跃游戏 (动态规划剪枝/前缀和/滑动窗口/BFS剪枝)
  17. px和毫米的换算_js转换px与mm, cm
  18. 桌面任务栏不见了解决办法
  19. 王宝强离婚成了谁的狂欢|严肃解读数据背后的媒体传播路径
  20. 20210829-基于CentOS7/Linux配置ssh免密登录

热门文章

  1. 异常:Incorrect result size: expected 1, actual 0
  2. r语言alasso的系数怎么看_R语言用msgps包做adaptive lasso,系数怎么提取啊?
  3. 2022 GopherChina 想听什么由你做主!
  4. 11. Container With Most Wate
  5. max2104打开时提醒注册插件出错_启动3dmax时出现插件程序集加载错误怎么办?
  6. 关于naked (C++)
  7. 彻底解决WPS右键没有新建文件的问题
  8. Properties 文件中字符串加了引号
  9. ios CAShapeLayer
  10. 【云服务器 ECS 实战】一文掌握弹性伸缩服务原理及配置方法