近日,21ic論壇TI無線連接論壇板塊分享了一張OSAL調度機制的圖,圖片如下
OSAL調度機制是何方神圣?
OSAL為Operating System Abstraction Layer,即操作系統(tǒng)抽象層,支持多任務運行,它并不是一個傳統(tǒng)意義上的操作系統(tǒng),但是實現(xiàn)了部分類似操作系統(tǒng)的功能。
OSAL概念是由TI公司在ZIGBEE協(xié)議棧引入,他的意思是”模擬操作系統(tǒng)”,此OS,并非一個真正的OS,而是模擬OS的一些方法為廣大編程者提供一種寫MCU程序的方法.當有一個事件發(fā)生的時候,OSAL負責將此事件分配給能夠處理此事件的任務,然后此任務判斷事件的類型,調用相應的事件處理程序進行處理。
現(xiàn)有的嵌入式操作系統(tǒng)可以分為兩類,即通用的多任務操作系統(tǒng)(General—purpose Multi-tasking OS)和事件驅動的操作系統(tǒng)(Event-driven OS)。前者能夠很好地支持多任務或者多線程,但是會隨著內部任務切換頻率的增加而產生很大的開銷,這類操作系統(tǒng)有:uC/OS-II、嵌入式Linux、WinCE等。后者支持數(shù)據(jù)流的高效并發(fā),并且考慮了系統(tǒng)的低功耗要求,在功耗、運行開銷等方面具有優(yōu)勢。典型的代表如TinyOSl291。
目前TinyOS操作系統(tǒng)支持的平臺有ATMEL公司的AVR系列、TI公司的MSP430系列。由于TinyOS操作系統(tǒng)還沒有對Chipcon公司(才知道TI把它收購了)提供CC2430開發(fā)平臺提供支持,因此,要在CC2430開發(fā)平臺上使用TinyOS系統(tǒng)來開發(fā)Zigbee協(xié)議棧軟件,就必須首先對TinyOS進行移植。
因此Chipcon公司為自己設計的ZStack協(xié)議棧中提供了一個名為操作系統(tǒng)抽象層OSAL的協(xié)議棧調度程序。
Osal主要提供如下功能:任務注冊、任務間同步互斥、中斷處理
存儲器分配和管理、提供定時器功能
OSAL的調度機制
協(xié)議棧調度程序(OSAL)的調度機制分為三部分:1、任務調度;2、時間管理;3、原語通信。
1、任務調度:osal采用一個鏈表結構來管理協(xié)議棧各層相應任務。相關操作函數(shù)有,添加任務到鏈表中;獲取下一個活動任務;根據(jù)taskID查找下一個任務。osal采用輪詢任務調度隊列(任務鏈表),通過兩個函數(shù):調度程序主循環(huán)函數(shù)和設置事件發(fā)生標志函數(shù)。
2、時間管理:通過為事件設置超時等待時間,一旦等待時間結束,便為對應任務設置事件發(fā)生標志,從而達到對事件進行延時處理目的。
3、原語通信:請求響應原語操作:一旦調用了下層相關函數(shù)后,就立即返回。下層處理函數(shù)在操作結束后,將結果以消息的形式發(fā)送到上層并產生一個系統(tǒng)事件,調度程序發(fā)現(xiàn)這個事件后就會調用相應的事件處理函數(shù)對它進行處理。兩個相關函數(shù):向目標任務發(fā)送消息的函數(shù);消息提取函數(shù)。
OSAL管理的實現(xiàn)
如果實現(xiàn)軟件和硬件的低耦合,使軟件不經改動或很少改動即可應用在另外的硬件上,這樣就方便硬件改造、升級、遷移后,軟件的移植。HAL硬件抽象層正是用來抽象各種硬件的資源,告知給軟件。其作用類似于嵌入式系統(tǒng)設備驅動的定義硬件資源的h頭文件。
BLE低功耗藍牙系統(tǒng)架構:
軟件功能是由任務事件來實現(xiàn)的,創(chuàng)建一個任務事件需要以下工作:
1. 創(chuàng)建task identifier任務ID;2. 編寫任務初始化(task initialization routine)進程,并需要添加到OSAL初始化進程中,這就是說系統(tǒng)啟動后不能動態(tài)添加功能;3. 編寫任務處理程序;4. 如有需要提供消息服務。BLE協(xié)議棧的各層都是以OSAL任務方式實現(xiàn),由于LL控制室的時間要求最為迫切,所以其任務優(yōu)先級最高。為了實現(xiàn)任務管理,OSAL通過消息處理(messageprocess),存儲管理,計時器定時等附加服務實現(xiàn)。
OSAL的系統(tǒng)啟動流程
為了使用OSAL,在main函數(shù)的最后要啟動一個名叫osal_start_system的進程,該進程會調用由特定應用決定的啟動函數(shù)osalInitTasks(來啟動系統(tǒng))。osalInitTasks逐個調用BLE協(xié)議棧各層的啟動進程來初始化協(xié)議棧。隨后,設置一個任務的8bit任務ID(task ID),跳入循環(huán)等待執(zhí)行任務,系統(tǒng)啟動完成。1. 任務優(yōu)先級決定于任務ID,任務ID越小,優(yōu)先級越高2. BLE協(xié)議棧各層的任務優(yōu)先級比應用程序的高3. 初始化協(xié)議棧后,越早調入的任務,任務ID越高,優(yōu)先級越低,即系統(tǒng)傾向于處理新到的任務每個事件任務由對應的16bit事件變量來標示,事件狀態(tài)由旗號(taskflag)來標示。如果事件處理程序已經完成,但其旗號并沒有移除,OSAL會認為事情還沒有完成而繼續(xù)在該程序中不返回。比如,在SimpleBLEPeripheral實例工程中,當事件START_DEVICE_EVT發(fā)生,其處理函數(shù)SimpleBLEPeripheral_ProcessEvent就運行,結束后返回16bit事件變量,并清除旗語SBP_START_DEVICE_EVT。每當OSAL事件檢測到了有任務事件,其相應的處理進程將被添加到由處理進程指針構成的事件處理表單中,該表單名叫taskArr(taskarray)。taskArr中各個事件進程的順序和osalInitTasks初始化函數(shù)中任務ID的順序是對應的。有兩種,最簡單的方法是使用osal_set_event函數(shù)(函數(shù)原型在OSAL.h文件中),在這個函數(shù)中,用戶可以像定義函數(shù)參數(shù)一樣設置任務ID和事件旗語。第二種方法是使用osal_start_timerEx函數(shù)(函數(shù)原型在OSAL_Timers.h文件中),使用方法同osal_set_event函數(shù),而第三個以毫秒為單位的參數(shù)osal_start_timerEx則指示該事件處理必須要在這個限定時間內,通過定時器來為事件處理計時。
類似于Linux嵌入式系統(tǒng)內存分配C函數(shù)mem_alloc,OSAL利用osal_mem_alloc提供基本的存儲管理,但osal_mem_alloc只有一個用于定義byte數(shù)的參數(shù)。對應的內存釋放函數(shù)為osal_mem_free。不同的子系統(tǒng)通過OSAL的消息機制通信。消息即為數(shù)據(jù),數(shù)據(jù)種類和長度都不限定。消息收發(fā)過程描述如下:
接收信息,調用函數(shù)osal_msg_allocate創(chuàng)建消息占用內存空間(已經包含了osal_mem_alloc函數(shù)功能),需要為該函數(shù)指定空間大小,該函數(shù)返回內存空間地址指針,利用該指針就可把所需數(shù)據(jù)拷貝到該空間。
發(fā)送數(shù)據(jù),調用函數(shù)osal_msg_send,需為該函數(shù)指定發(fā)送目標任務,OSAL通過旗語SYS_EVENT_MSG告知目標任務,目標任務的處理函數(shù)調用osal_msg_receive來接收發(fā)來的數(shù)據(jù)。建議每個OSAL任務都有一個消息處理函數(shù),每當任務收到一個消息后,通過消息的種類來確定需要本任務做相應處理。消息接收并處理完成,調用函數(shù)osal_msg_deallocate來釋放內存(已經包含了osal_mem_free函數(shù)功能)。
為了實現(xiàn)更好的移植性,協(xié)議棧將硬件層抽象出了一個HAL硬件抽象層,當新的硬件平臺做好后,只需修改HAL,而不需修改HAL之上的協(xié)議棧的其他組件和應用程序。
-
調度機制
+關注
關注
0文章
4瀏覽量
6823 -
OSAL
+關注
關注
0文章
5瀏覽量
8879
原文標題:一文摸清OSAL調度機制
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
評論