• [nRF51822] 4、 图解nRF51 SDK中的Schedule handling library 和Timer library


     

    :nRF51822虽然是一个小型的单片机,但是能真正达到任意调用其官方驱动以及BLE协议栈的人还是奇缺的。据我所见,大都拿官方给的一个冗长的蓝牙低功耗心率计工程改的。之前我对于这个工程进行log跟踪,虽然理清了其大致流程,但还是达不到任意修改甚至是构建自己的框架的程度。本文接上一篇,继续理解library中的调度处理和定时器部分。

    1、Schedule handling library

    调度程序主要负责从中断上下文向main函数上下文传送执行命令。

    在main函数中:

    1.为每种期望的事件定义句柄

    2.在进入main函数的循环前调用APP_SCHED_INIT()初始化调度程序

    3.在main loop中每次因为事件(特别是sd_app_evt_wait()返回)而唤醒应用时调用app_sched_execute()

    在中断中:

    1.在中断句柄中调用app_sched_event_put将相应的参数和事件句柄传入。这样,会把一个中断事件插入到sched队列中。

    2.app_sched_ececute函数将会取出该事件并在main中调用它的句柄。

    ps:关于这个的例子在HID Mouse Application和HID Keyboard Application中有介绍,这些留着后面讲。

              图为:The high level design of the scheduler

    Applications using the Scheduler

    在示例中使用scheduler的事件流图

                  图为:Receiving an event from the ble stack causing a service event

                          图为:The battery timer expires

    Applications not using the Scheduler

    不使用scheduler的事件流图(这个就是我们之前分析的hrs应用,采用ble_evt_dispatch将BLE协议栈层的消息在main中分配给各个模块来处理

              图为: Receiving an event from the ble stack causing a service event

                          图为:The battery timer expires

    2、Timer library

    你可以基于RTC1创建多个定时器实例。检查定时器是否timeout是在RTC1的中断中,定时器列表处理实在软中断(SWI0)中。这两个中断都是低优先级的。

    Note

    当调用app_timer_start()或者app_timer_stop()时,定时这两个器操作会在等待排队并且触发软件中断。他们实际上是在SWI0中断中被执行的。由于SWI0是低优先级,如果应用程序代码调用的定时器功能函数正处于APP_HIGH或者APP_LOW,start和stop操作将直到应用程序句柄返回才会被执行。

    在APP_TIMER_INIT中使用使用USE_SCHEDULER参数来选择是否用scheduler。

    @beautifulzzzz 2016-01-01 continue~  

  • 相关阅读:
    缓冲区溢出学习笔记 一
    什么是TNotifyEvent(转)
    Delphi中dll的使用(转)
    bash 编程
    感觉自己真的很幸运
    开始写程序,发现自己很弱智
    你是我心中不变的新绿(转载)
    做一次年度总结和清理
    今天简直成精力狂了^_^
    Double Do weeks Again : )
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/5092871.html
Copyright © 2020-2023  润新知