近日,21ic論壇TI無線連接論壇板塊分享了一張OSAL調度機制的圖,圖片如下
OSAL調度機制是何方神圣?
OSAL為Operating System Abstraction Layer,即操作系統抽象層,支持多任務運行,它并不是一個傳統意義上的操作系統,但是實現了部分類似操作系統的功能。
OSAL概念是由TI公司在ZIGBEE協議棧引入,他的意思是”模擬操作系統”,此OS,并非一個真正的OS,而是模擬OS的一些方法為廣大編程者提供一種寫MCU程序的方法.當有一個事件發生的時候,OSAL負責將此事件分配給能夠處理此事件的任務,然后此任務判斷事件的類型,調用相應的事件處理程序進行處理。
現有的嵌入式操作系統可以分為兩類,即通用的多任務操作系統(General—purpose Multi-tasking OS)和事件驅動的操作系統(Event-driven OS)。前者能夠很好地支持多任務或者多線程,但是會隨著內部任務切換頻率的增加而產生很大的開銷,這類操作系統有:uC/OS-II、嵌入式Linux、WinCE等。后者支持數據流的高效并發,并且考慮了系統的低功耗要求,在功耗、運行開銷等方面具有優勢。典型的代表如TinyOSl291。
目前TinyOS操作系統支持的平臺有ATMEL公司的AVR系列、TI公司的MSP430系列。由于TinyOS操作系統還沒有對Chipcon公司(才知道TI把它收購了)提供CC2430開發平臺提供支持,因此,要在CC2430開發平臺上使用TinyOS系統來開發Zigbee協議棧軟件,就必須首先對TinyOS進行移植。
因此Chipcon公司為自己設計的ZStack協議棧中提供了一個名為操作系統抽象層OSAL的協議棧調度程序。
Osal主要提供如下功能:任務注冊、任務間同步互斥、中斷處理
存儲器分配和管理、提供定時器功能
OSAL的調度機制
協議棧調度程序(OSAL)的調度機制分為三部分:1、任務調度;2、時間管理;3、原語通信。
1、任務調度:osal采用一個鏈表結構來管理協議棧各層相應任務。相關操作函數有,添加任務到鏈表中;獲取下一個活動任務;根據taskID查找下一個任務。osal采用輪詢任務調度隊列(任務鏈表),通過兩個函數:調度程序主循環函數和設置事件發生標志函數。
2、時間管理:通過為事件設置超時等待時間,一旦等待時間結束,便為對應任務設置事件發生標志,從而達到對事件進行延時處理目的。
3、原語通信:請求響應原語操作:一旦調用了下層相關函數后,就立即返回。下層處理函數在操作結束后,將結果以消息的形式發送到上層并產生一個系統事件,調度程序發現這個事件后就會調用相應的事件處理函數對它進行處理。兩個相關函數:向目標任務發送消息的函數;消息提取函數。
OSAL管理的實現
如果實現軟件和硬件的低耦合,使軟件不經改動或很少改動即可應用在另外的硬件上,這樣就方便硬件改造、升級、遷移后,軟件的移植。HAL硬件抽象層正是用來抽象各種硬件的資源,告知給軟件。其作用類似于嵌入式系統設備驅動的定義硬件資源的h頭文件。
BLE低功耗藍牙系統架構:
軟件功能是由任務事件來實現的,創建一個任務事件需要以下工作:
1. 創建task identifier任務ID;2. 編寫任務初始化(task initialization routine)進程,并需要添加到OSAL初始化進程中,這就是說系統啟動后不能動態添加功能;3. 編寫任務處理程序;4. 如有需要提供消息服務。BLE協議棧的各層都是以OSAL任務方式實現,由于LL控制室的時間要求最為迫切,所以其任務優先級最高。為了實現任務管理,OSAL通過消息處理(messageprocess),存儲管理,計時器定時等附加服務實現。
OSAL的系統啟動流程
為了使用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之上的協議棧的其他組件和應用程序。
-
調度機制
+關注
關注
0文章
4瀏覽量
6781 -
OSAL
+關注
關注
0文章
5瀏覽量
8758
原文標題:一文摸清OSAL調度機制
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論