: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中有介绍,这些留着后面讲。

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

          图为:The high level design of the scheduler

Applications using the Scheduler

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

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

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

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

                      图为:The battery timer expires

Applications not using the Scheduler

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

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

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

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

                      图为: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~ 

04-25 11:40