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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM