zoukankan      html  css  js  c++  java
  • [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~  

  • 相关阅读:
    学习使用apt(三)
    2005 男人感悟100(转自MOP)
    学习使用apt
    学习使用apt(四)
    编译glib1.2.20r5出错./libtool: line 297
    poj1004的java实现
    猜算式
    基于爬山算法求解TSP问题(JAVA)
    mysql数据库的简单语句的介绍(1)
    NYOJ42 一笔画问题
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/5092871.html
Copyright © 2011-2022 走看看