:nRF51822虽然是一个小型的单片机,但是能真正达到任意调用其官方驱动以及BLE协议栈的人还是奇缺的。据我所见,大都拿官方给的一个冗长的蓝牙低功耗心率计工程改的。之前我对于这个工程进行log跟踪,虽然理清了其大致流程,但还是达不到任意修改甚至是构建自己的框架的程度。本文接上一篇,继续理解library中的调度处理和定时器部分。
调度程序主要负责从中断上下文向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
在示例中使用scheduler的事件流图
图为:Receiving an event from the ble stack causing a service event
图为:The battery timer expires
不使用scheduler的事件流图( 这个就是我们之前分析的hrs应用,采用ble_evt_dispatch将BLE协议栈层的消息在main中分配给各个模块来处理 )
图为: Receiving an event from the ble stack causing a service event
图为:The battery timer expires
你可以基于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~