定时模块app_timer用法及常见问题—nRF5 SDK模块系列二
app_timer是大家经常用到的一个库,app_timer的功能就是定时,也就是说,你在某一时刻启动一个app timer并设定超时时间,超时时间一到,app_timer就会回调timeout handler,然后执行你需要的工作。使用app_timer时有如下几点需要注意:
- app_timer底层使用的是RTC1,而不是timer1/2/3/4,所以app_timer的功耗非常低:0.1uA左右。
- app_timer计时精度为1ms,也就是说,app_timer只能计时毫秒的倍数,如果你的计时精度小于1ms,请使用传统timer1/2/3/4来做。
- app_timer计时不是很准确。app_timer库可以创建几十甚至上百个app timer,每次start或者stop这些timer,都会对其他timer计时精度产生一些影响。而且app_timer的中断优先级也不高,所以timeout handler经常会被推迟执行。
- 启动或者停止app_timer都是异步的,也就是说,当调用app_timer_start或者app_timer_stop时,系统只是把start或者stop操作入队,然后触发一个软中断,如果此时上下文环境的中断优先级高于软中断,那么只有等退出了当前上下文环境后才会真正去执行软中断handler然后启动或者停止timer,这也是为什么app_timer模块需要一个operation queue,并通过APP_TIMER_CONFIG_OP_QUEUE_SIZE来配置其大小;如果此时上下文环境的优先级低于软中断,那么立即触发软中断handler并启动或者停止timer。
用法说明
一般按照如下步骤使用app_timer:
- 修改app_timer默认配置参数,如下:

- 创建app_timer。创建app timer时,先定义一个timer ID,用来表示这个timer,然后选择app timer模式:single shot或者repeated。Single shot模式app timer只运行一次,timeout后执行timeout handler然后自动停止app timer。Repeated模式app timer自动循环执行,每次timeout后执行timeout handler,然后继续计时,直到下一个timeout然后再次执行timeout handler,如此循环往复。创建app timer的时候,还需要定义timeout handler。
APP_TIMER_DEF(my_timer_id); //定义timer ID
err_code = app_timer_create(&my_timer_id, APP_TIMER_MODE_REPEATED, my_timeout_handler)
static void my_timeout_handler (void * p_context)
{
//add your code here
}
- 启动app_timer或者停止app_timer。前面也提及过,启动或者停止timer是异步的,所以我们有一个operation queue来存放start或者stop操作。真正的start或者stop操作是通过软中断0来实现的。
err_code = app_timer_start(my_timer_id, APP_TIMER_TICKS(), NULL); //启动timer并定时10ms err_code = app_timer_stop(my_timer_id);
常见使用问题
目前看到的常见使用问题有:
- 没有按照使用说明来使用app_timer,比如定义app timer ID的时候不使用宏APP_TIMER_DEF,超时时间不使用宏APP_TIMER_TICKS来计算。
- 多次重复调用同一个app_timer_create。app_timer_create用于创建一个timer,多次调用同一个app_timer_create,会让系统产生多个相同ID的app timer,以致于系统出现不可知的行为。
- Stop没有start的timer。当一个timer没有通过app_timer_start启动时,使用app_timer_stop停止它时,或者使用app_timer_stop停止一个不存在的timer时,会打乱app timer的正常行为,产生不可预测的结果。
- Operation queue溢出。这个需要具体问题具体分析,有时候operation queue溢出不一定是因为queue size设置太小导致的,而是系统某个地方,确切说某个中断例程,执行时间太久,导致start和stop操作积累太多,从而产生queue溢出,这个时候就必须找出这个中断例程执行时间太久的原因,才能从根本上解决这个问题。
- 没有初始化app_scheduler,而直接使用app_timer的schedule模式。app_scheduler原理及使用说明见:https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v15.3.0%2Flib_scheduler.html&cp=5_1_3_38,概括来说,app_scheduler的作用就是把长长的中断代码从中断函数转到main线程中来执行。
定时模块app_timer用法及常见问题—nRF5 SDK模块系列二的更多相关文章
- Flash访问模块FDS用法及常见问题—nRF5 SDK模块系列一
FDS,全称Flash Data Storage,用来访问芯片内部Flash的.当你需要把数据存储在Flash中,或者读取Flash中的用户数据,或者更新或者删除Flash中的数据,那么FDS模块是你 ...
- nRF5 SDK for Mesh(二) Getting started 快速开始
Getting started To get started, take a look at the Light switch demo. It shows how a simple applicat ...
- SpringMVC +mybatis+spring 结合easyui用法及常见问题总结
SpringMVC +mybatis+spring 结合easyui用法及常见问题总结 1.FormatString的用法. 2.用postAjaxFillGrid实现dataGrid 把form表单 ...
- nRF5 SDK软件架构及softdevice工作原理
本文将介绍Nordic nRF5 SDK软件架构以及softdevice工作原理,以加深大家对Nordic产品开发的理解,这样开发过程中碰到问题时,大家也知道如何去调试. 如果你刚开始接触nRF5 S ...
- 如何调试nRF5 SDK
本文将讲述Nordic nRF5 SDK的主要调试手段,以帮助大家快速定位问题,并解决问题.一般来说,你可以通过打log方式,IDE的debug模式,SDK自带的app_error_check函数,以 ...
- Nordic nRF5 SDK和softdevice介绍
SDK和Softdevice的区别是什么?怎么选择SDK和softdevice版本?芯片,SDK和softdevice有没有版本兼容问题?怎么理解SDK目录结构?SDK帮助文档在哪里?Softdevi ...
- json模块和pickle模块的用法
在python中,可以使用pickle和json两个模块对数据进行序列化操作 其中: json可以用于字符串或者字典等与python数据类型之间的序列化与反序列化操作 pickle可以用于python ...
- Atitit 常用sdk 模块 组织架构切分 规范与范例attilax总结
Atitit 常用sdk 模块 组织架构切分 规范与范例attilax总结 常用200个模块 2017/04/12 22:01 <DIR> acc 2017/04 ...
- python之模块py_compile用法(将py文件转换为pyc文件)
# -*- coding: cp936 -*- #python 27 #xiaodeng #python之模块py_compile用法(将py文件转换为pyc文件):二进制文件,是由py文件经过编译后 ...
随机推荐
- oracle查看被锁的表和被锁的进程,杀掉进程
-- 1. 查看被锁的表 SELECT p.spid, a.serial#, c.object_name, b.session_id, b.oracle_username,b.os_user_name ...
- MongoDB的安全校验
一.MongoDB安全校验的重要性 每个MongoDB实例中的数据库都可以有许多用户.如果没有开启安全校验,限制用户权限,则每个进到数据库的用户都能任意的对数据库数据进行读,写甚至是读写操作.这样的场 ...
- matplotlib绘制柱状图
参考自Matplotlib Python 画图教程 (莫烦Python)(11)_演讲•公开课_科技_bilibili_哔哩哔哩 https://www.bilibili.com/video/av16 ...
- PKU 3318 Matrix Multiplication(神奇的输入)
#include<cstdio> using namespace std; ][]; ][],C[][]; int Read() { ; ; while((ch=getchar())==' ...
- win下安装wget以及使用wget
1. 安装wget网址:http://gnuwin32.sourceforge.net/packages/wget.htm下载http://downloads.sourceforge.net/gnuw ...
- 牛客国庆集训派对Day3 I. - Metropolis (Dijkstra变型)
题意:求一个N个点无向图中,其中p个关键点间的最短距离. 分析:比较特殊的最短路,方式类似于多源BFS,将所有关键点装入优先队列,状态中需要包含其源点的id.对每条边都要遍历,对每个节点,需要记录其确 ...
- Spring AOP (事务管理)
一.声明式事务管理的概括 声明式事务(declarative transaction management)是Spring提供的对程序事务管理的方式之一. Spring的声明式事务顾名思义就是采用声明 ...
- java中内存泄露和内存溢出
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出. ...
- FWT快速沃尔什变换
前言 学多项式怎么能错过\(FWT\)呢,然而这真是个毒瘤的东西,蒟蒻就只会背公式了\(\%>\_<\%\) 或卷积 \[\begin{aligned}\\ tf(A) = (tf(A_0 ...
- WCF服务类的实例模式(本文为转载)
WCF开发时如何选择正确的实例模式(InstanceMode)? 在使用WCF实例模型时,你是否思考过这几个的问题: ”WCF中的实例模式如何正确应用”? ”使用WCF中的实例模式有何原则可以遵循 ...