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