[nRF51822] 3、 新年也来个总结——图解nRF51 SDK中的Button handling library和FIFO library...
:本篇是我翻译并加入自己理解的nRF51 SDK中按钮相关操作的库和先进先出队列库。虽然是nRF51的SDK,但是通过此文你将更多地了解到在BSP(板级支持)上层嵌入式程序或OS的构建方法。
1、按钮相关操作库
按键管理程序是通过GPIO事务和事件管理程序来检测一个按钮是否被按下的。当然,其中也做了消抖的工作——在GPIOTE事件中启动一个定时器用来延时一段时间,当该定时器失效后如果按钮仍然处于按下状态,则会产生一个按钮事件。如果在延时的过程中又有一个新的GPIOTE,那么这个定时器会重新被启动。此外,在APP_BUTTON_INIT()参数中,使用USE_SCHEDULER参数来决定是否使用scheduler。(关于GPIOTE和SCHEDULER会在下面详细讲)
app_button模块会用到app_timer模块。用户必须确保app_timer的队列足够大来容纳app_timer_stop()和app_timer_start()操作(注意:这两个操作会在每个GPIOTE事件中执行,所以频度很高!)
ps:即使scheduler没被用,app_button.h也要包含app_scheduler.h!
2、先进先出队列
该队列采用环形缓冲,其大小和缓冲区在初始化的地方配置,如下:
1 // Create a FIFO 2 structureapp_fifo_t my_fifo; 3 4 // Create a buffer for the FIFO 5 uint16_t buffer_size = 8; 6 uint8_t buffer[buffer_size]; 7 8 // Initialize FIFO structure 9 uint32_t err_code = app_fifo_init(&test_fifo, buffer, (uint16_t)sizeof(buffer));
ps:1.通过app_fifo_init函数,test_fifo会被初始化(其结构体如下)。2.buffer的大小应该是2的倍数。3.一定要确保当FIFO在用的时候,app_fifo_t的缓冲内存不被回收了
1 typedef struct{ 2 uint8_t * p_buf; /**< Pointer to FIFO buffer memory. */ 3 uint16_t buf_size_mask; /**< Read/write index mask. Also used for size checking. */ 4 volatile uint32_t read_pos; /**< Next read position in the FIFO buffer. */ 5 volatile uint32_t write_pos; /**< Next write position in the FIFO buffer. */ 6 } app_fifo_t;
这是个环形FIFO队列,p_buf是调用初始化函数中传入的数据池地址,read_pos和write_pos是读地址和写地址~此外,既然是环形FIFO就要用到mod,即:假设环形fifo数据池大小为n,当前写入数据为第x个,则应该写在xmodn位置。这里官方用了个小技巧(如下英语),首先要保证buffer-size是2的倍数,这样xMODn就等于xAND(n-1)。
>>To simplify the index handling, the FIFO is restricted to require the buffer size <n>
, to be a power of two, as this reduces the modulus operation to become a simple AND operation with
.<n>
- 1
n = 8 = 0b00001000
n - 1 = 7 = 0b00000111
ANDing any number with <n>-1 , is identical to the modulus operation of <n>, when <n> is a power of two, see below:
3 = 11 mod 8 = 11 AND 7 = 0b00001011 & 0b00000111 = 0b00000011 = 3 .
♠ 若n=8,则初始状态下FIFO为:
♠ 插入一个8位uint8数据则:
1 uint8_t data = 88; 2 // Add an element to the FIFO 3 err_code = app_fifo_put(&my_fifo, data);
上图为插入4个uint8的效果~
♠ 取出一个8位uint8数据的代码为:
1 // Consume one element from FIFO 2 uint8_t return_val; 3 err_code = app_fifo_get(&my_fifo, &return_val);
下图为取出两个的效果~
♠ Empty Buffer
当read_pos=write_pos时表示buffer是空的。
初始化的时候读写位置都置为0、buffer内的内容被取完或者调用app_fifo_flush。
此时再调用读函数则返回没数据。
♠ Full Buffer
当write_pos == read_pos + <n>时表示buffer是满的。
此时再调用写函数则返回没内存。
@beautifulzzzz 2016-01-01 continue~
转载于:https://www.cnblogs.com/zjutlitao/p/5091099.html
[nRF51822] 3、 新年也来个总结——图解nRF51 SDK中的Button handling library和FIFO library...相关推荐
- [nRF51822] 5、 霸屏了——详解nRF51 SDK中的GPIOTE(从GPIO电平变化到产生中断事件的流程详解)...
:由于在大多数情况下GPIO的状态变化都会触发应用程序执行一些动作.为了方便nRF51官方把该流程封装成了GPIOTE,全称:The GPIO Tasks and Events (GPIOTE) . ...
- 图解连续学习中的蓄水池抽样算法(The Illustrated Reservoir sampling)
图解连续学习中的蓄水池抽样算法The Illustrated Reservoir sampling 前言 什么是Reservoir Sampling? 蓄水池抽样算法(Reservoir sampli ...
- go interface转int_24. 图解 Go语言中的反射三定律
大家好,我是明哥. 由于某些不可抗力,之前该专栏的所有内容都被删除了.因此之后的一段时间内,我会重新发布这些文章,先给已经看过的关注者提个醒. 本文原文:http://golang.iswbm.com ...
- rsatool使用步骤图解_工作中想要事半功倍?图解来助你
一次会议上,老板让我们进行一场头脑风暴,然后将脑中浮现出来的想法以ppt的形式,在会议上与大家分享.在会上我看到其他区域的同事做的ppt,真的叫一个精美啊,有图形对比.有案例分析.有未来展望.反观自己 ...
- 两个数组中对应的下标的值合成一个新的数组_剑指 offer 面试题精选图解 03 . 数组中重复的数字
今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 面试题03. 数组中重复的数字. 题目链接:https://leetcode-cn.com/problems/shu-zu-zhon ...
- 图解在EXCEL中,通过身份证自动获得出生日期和性别。
要进行设置的表格类似下图所示: 要得到的效果是,当输入完身份证号码的时候,性别和出生日期字段,就会根据刚才输入的身份证号码而自动进行填充,在这之前,我们要把身份证的单元格格式数字设定为文本.具体步骤, ...
- 图解链表 —— JAVA中的单链表基本操作
文章目录 1. 什么是链表 2. 链表的种类 3. 创建单链表 3.1 创建 Node 类(车厢类) 3.2 创建 MySingleList (火车类) 4. 单链表的基本操作 4.1 增加链表元素 ...
- 图解C/C++中函数参数的值传递、指针传递与引用传递
因为一直对这几种函数参数的传递方式理解的不是很透彻,花了一段时间仔细捋清了他们之间的区别.这个问题也是编程初级阶段会经常遇到的问题,也是有可能在面试中遇到的基本问题,在此进行了简单的总结一下,一是加深 ...
- 图解在emu8086中学习几条汇编语言常用语句
mov bx, 1000H ;8086CPU不支持将数据直接送入段寄存器的操作 mov ds, bx ;ds存放数据段地址 mov [0], al ;将al数据(1字节)存到1000H段的0偏移地址处 ...
最新文章
- mysql数据库隐式表_详解MySQL数据库常见的索引问题:无索引,隐式转换,附实例说明...
- .Net Core扩展 SharpPlugs简单上手
- 《php中文网教学管理系统》总结
- Pixhawk之姿态控制篇(1)_源码算法分析(超级有料)
- PAT1001 A+B Format (20 分)
- Mybatis源码分析之(七)Mybatis一级缓存和二级缓存的实现
- 带徽标的Bootstrap 3 Navbar
- 初学QML之QML和C++混合方法
- java学习(六)多线程 中
- JS判断是否在微信浏览器打开
- js 操作java对象_[Java教程]js 对象操作 对象原型操作 把一个对象A赋值给另一个对象B 并且对象B 修改 不会影响 A对象...
- 深入浅出MFC.pdf
- 软件设计师-8.算法分析与设计
- python删除一行代码_python基础教程:python3.7 openpyxl 删除指定一列或者一行的代码...
- HTTP请求的完整过程
- windows功能_windows必备的系统功能增强2具,免费,简单,实用
- 教你控制阿里云OSS下载速度
- Java如何处理参数中带特殊符号的请求?
- 机器学习(四):关于模型复杂度与模型性能的关系
- 谋定信博会入政府规划-赵洪涛:易华录经信研究大数据