CC2541 OSAL工作原理

藍牙爲了實現同多個設備相連,或實現多功能,也實現了功能擴充,這就產生了調度問題。因爲,雖然軟件和協議棧可擴充,但終究最底層的執行部門只有一個。爲了實現多事件和多任務切換,需要把事件和任務對應的應用,並起一個名字OSAL操作系統抽象層。

  OSAL管理的實現

  如果實現軟件和硬件的低耦合,使軟件不經改動或很少改動即可應用在另外的硬件上,這樣就方便硬件改造、升級、遷移後,軟件的移植。HAL硬件抽象層正是用來抽象各種硬件的資源,告知給軟件。其作用類似於嵌入式系統設備驅動的定義硬件資源的h頭文件。

  BLE低功耗藍牙系統架構:

藍牙4.0/BLE協議棧開發攻略大全

  OSAL作爲調度核心,BLE協議棧、profile定義、所有的應用都圍繞它來實現。OSAL不是傳統大家使用的操作系統,而是一個允許軟件建立和執行事件的循環。

  軟件功能是由任務事件來實現的,創建一個任務事件需要以下工作:

  1. 創建task identifier任務ID;

  2. 編寫任務初始化(task initialization routine)進程,並需要添加到OSAL初始化進程中,這就是說系統啓動後不能動態添加功能;

  3. 編寫任務處理程序;

  4. 如有需要提供消息服務。

  BLE協議棧的各層都是以OSAL任務方式實現,由於LL控制室的時間要求最爲迫切,所以其任務優先級最高。爲了實現任務管理,OSAL通過消息處理(messageprocess),存儲管理,計時器定時等附加服務實現。

  系統啓動流程:

藍牙4.0/BLE協議棧開發攻略大全

  爲了使用OSAL,在main函數的最後要啓動一個名叫osal_start_system的進程,該進程會調用由特定應用決定的啓動函數 osalInitTasks(來啓動系統)。osalInitTasks逐個調用BLE協議棧各層的啓動進程來初始化協議棧。隨後,設置一個任務的 8bit任務ID(task ID),跳入循環等待執行任務,系統啓動完成。

  1. 任務優先級決定於任務ID,任務ID越小,優先級越高

  2. BLE協議棧各層的任務優先級比應用程序的高

  3. 初始化協議棧後,越早調入的任務,任務ID越高,優先級越低,即系統傾向於處理新到的任務

  每個事件任務由對應的16bit事件變量來標示,事件狀態由旗號(taskflag)來標示。如果事件處理程序已經完成,但其旗號並沒有移除,OSAL會認爲事情還沒有完成而繼續在該程序中不返回。比如,在SimpleBLEPeripheral實例工程中,當事件START_DEVICE_EVT發生,其處理函數SimpleBLEPeripheral_ProcessEvent就運行,結束後返回16bit事件變量,並清除旗語 SBP_START_DEVICE_EVT。

  每當OSAL事件檢測到了有任務事件,其相應的處理進程將被添加到由處理進程指針構成的事件處理表單中,該表單名叫taskArr(taskarray)。taskArr中各個事件進程的順序和osalInitTasks初始化函數中任務ID的順序是對應的。

  有兩種,最簡單的方法是使用osal_set_event函數(函數原型在OSAL.h文件中),在這個函數中,用戶可以像定義函數參數一樣設置任務ID 和事件旗語。第二種方法是使用osal_start_timerEx函數(函數原型在OSAL_Timers.h文件中),使用方法同 osal_set_event函數,而第三個以毫秒爲單位的參數osal_start_timerEx則指示該事件處理必須要在這個限定時間內,通過定時器來爲事件處理計時。

  類似於Linux嵌入式系統內存分配C函數mem_alloc,OSAL利用osal_mem_alloc提供基本的存儲管理,但osal_mem_alloc只有一個用於定義byte數的參數。對應的內存釋放函數爲osal_mem_free。

  不同的子系統通過OSAL的消息機制通信。消息即爲數據,數據種類和長度都不限定。消息收發過程描述如下:

  接收信息,調用函數osal_msg_allocate創建消息佔用內存空間(已經包含了osal_mem_alloc函數功能),需要爲該函數指定空間大小,該函數返回內存空間地址指針,利用該指針就可把所需數據拷貝到該空間。

  發送數據,調用函數osal_msg_send,需爲該函數指定發送目標任務,OSAL通過旗語SYS_EVENT_MSG告知目標任務,目標任務的處理函數調用osal_msg_receive來接收發來的數據。建議每個OSAL任務都有一個消息處理函數,每當任務收到一個消息後,通過消息的種類來確定需要本任務做相應處理。消息接收並處理完成,調用函數osal_msg_deallocate來釋放內存(已經包含了osal_mem_free函數功能)。

  爲了實現更好的移植性,協議棧將硬件層抽象出了一個HAL硬件抽象層,當新的硬件平臺做好後,只需修改HAL,而不需修改HAL之上的協議棧的其他組件和應用程序。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章