:本篇是我翻译并加入自己理解的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...相关推荐

  1. [nRF51822] 5、 霸屏了——详解nRF51 SDK中的GPIOTE(从GPIO电平变化到产生中断事件的流程详解)...

    :由于在大多数情况下GPIO的状态变化都会触发应用程序执行一些动作.为了方便nRF51官方把该流程封装成了GPIOTE,全称:The GPIO Tasks and Events (GPIOTE) . ...

  2. 图解连续学习中的蓄水池抽样算法(The Illustrated Reservoir sampling)

    图解连续学习中的蓄水池抽样算法The Illustrated Reservoir sampling 前言 什么是Reservoir Sampling? 蓄水池抽样算法(Reservoir sampli ...

  3. go interface转int_24. 图解 Go语言中的反射三定律

    大家好,我是明哥. 由于某些不可抗力,之前该专栏的所有内容都被删除了.因此之后的一段时间内,我会重新发布这些文章,先给已经看过的关注者提个醒. 本文原文:http://golang.iswbm.com ...

  4. rsatool使用步骤图解_工作中想要事半功倍?图解来助你

    一次会议上,老板让我们进行一场头脑风暴,然后将脑中浮现出来的想法以ppt的形式,在会议上与大家分享.在会上我看到其他区域的同事做的ppt,真的叫一个精美啊,有图形对比.有案例分析.有未来展望.反观自己 ...

  5. 两个数组中对应的下标的值合成一个新的数组_剑指 offer 面试题精选图解 03 . 数组中重复的数字

    今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 面试题03. 数组中重复的数字. 题目链接:https://leetcode-cn.com/problems/shu-zu-zhon ...

  6. 图解在EXCEL中,通过身份证自动获得出生日期和性别。

    要进行设置的表格类似下图所示: 要得到的效果是,当输入完身份证号码的时候,性别和出生日期字段,就会根据刚才输入的身份证号码而自动进行填充,在这之前,我们要把身份证的单元格格式数字设定为文本.具体步骤, ...

  7. 图解链表 —— JAVA中的单链表基本操作

    文章目录 1. 什么是链表 2. 链表的种类 3. 创建单链表 3.1 创建 Node 类(车厢类) 3.2 创建 MySingleList (火车类) 4. 单链表的基本操作 4.1 增加链表元素 ...

  8. 图解C/C++中函数参数的值传递、指针传递与引用传递

    因为一直对这几种函数参数的传递方式理解的不是很透彻,花了一段时间仔细捋清了他们之间的区别.这个问题也是编程初级阶段会经常遇到的问题,也是有可能在面试中遇到的基本问题,在此进行了简单的总结一下,一是加深 ...

  9. 图解在emu8086中学习几条汇编语言常用语句

    mov bx, 1000H ;8086CPU不支持将数据直接送入段寄存器的操作 mov ds, bx ;ds存放数据段地址 mov [0], al ;将al数据(1字节)存到1000H段的0偏移地址处 ...

最新文章

  1. mysql数据库隐式表_详解MySQL数据库常见的索引问题:无索引,隐式转换,附实例说明...
  2. .Net Core扩展 SharpPlugs简单上手
  3. 《php中文网教学管理系统》总结
  4. Pixhawk之姿态控制篇(1)_源码算法分析(超级有料)
  5. PAT1001 A+B Format (20 分)
  6. Mybatis源码分析之(七)Mybatis一级缓存和二级缓存的实现
  7. 带徽标的Bootstrap 3 Navbar
  8. 初学QML之QML和C++混合方法
  9. java学习(六)多线程 中
  10. JS判断是否在微信浏览器打开
  11. js 操作java对象_[Java教程]js 对象操作 对象原型操作 把一个对象A赋值给另一个对象B 并且对象B 修改 不会影响 A对象...
  12. 深入浅出MFC.pdf
  13. 软件设计师-8.算法分析与设计
  14. python删除一行代码_python基础教程:python3.7 openpyxl 删除指定一列或者一行的代码...
  15. HTTP请求的完整过程
  16. windows功能_windows必备的系统功能增强2具,免费,简单,实用
  17. 教你控制阿里云OSS下载速度
  18. Java如何处理参数中带特殊符号的请求?
  19. 机器学习(四):关于模型复杂度与模型性能的关系
  20. 谋定信博会入政府规划-赵洪涛:易华录经信研究大数据

热门文章

  1. ES01 数据类型、正则表达式、身份证校验
  2. python-第二块:time模块和datatime模块
  3. windows下安装virtual box(ubuntu)
  4. SqlServer 添加用户 添加角色 分配权限
  5. 通过OleDB连接方式,访问Access,Excel数据库.
  6. win10+python373安装pycrypto
  7. 李彦宏:AI在我有生之年不会毁灭人类
  8. Python + Selenium 基础篇 - 打开和关闭浏览器
  9. ★自制社交网站等级称号
  10. Ubuntu安装docker-ELK