0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OSAL你想知道的都在這里

Q4MP_gh_c472c21 ? 來(lái)源:cc ? 2019-02-19 14:12 ? 次閱讀

近日,21ic論壇TI無(wú)線連接論壇板塊分享了一張OSAL調(diào)度機(jī)制的圖,圖片如下

OSAL調(diào)度機(jī)制是何方神圣?

OSAL為Operating System Abstraction Layer,即操作系統(tǒng)抽象層,支持多任務(wù)運(yùn)行,它并不是一個(gè)傳統(tǒng)意義上的操作系統(tǒng),但是實(shí)現(xiàn)了部分類似操作系統(tǒng)的功能。

OSAL概念是由TI公司ZIGBEE協(xié)議棧引入,他的意思是”模擬操作系統(tǒng)”,此OS,并非一個(gè)真正的OS,而是模擬OS的一些方法為廣大編程者提供一種寫MCU程序的方法.當(dāng)有一個(gè)事件發(fā)生的時(shí)候,OSAL負(fù)責(zé)將此事件分配給能夠處理此事件的任務(wù),然后此任務(wù)判斷事件的類型,調(diào)用相應(yīng)的事件處理程序進(jìn)行處理。

現(xiàn)有的嵌入式操作系統(tǒng)可以分為兩類,即通用的多任務(wù)操作系統(tǒng)(General—purpose Multi-tasking OS)和事件驅(qū)動(dòng)的操作系統(tǒng)(Event-driven OS)。前者能夠很好地支持多任務(wù)或者多線程,但是會(huì)隨著內(nèi)部任務(wù)切換頻率的增加而產(chǎn)生很大的開銷,這類操作系統(tǒng)有:uC/OS-II、嵌入式Linux、WinCE等。后者支持?jǐn)?shù)據(jù)流的高效并發(fā),并且考慮了系統(tǒng)的低功耗要求,在功耗、運(yùn)行開銷等方面具有優(yōu)勢(shì)。典型的代表如TinyOSl291。

目前TinyOS操作系統(tǒng)支持的平臺(tái)有ATMEL公司的AVR系列、TI公司的MSP430系列。由于TinyOS操作系統(tǒng)還沒有對(duì)Chipcon公司(才知道TI把它收購(gòu)了)提供CC2430開發(fā)平臺(tái)提供支持,因此,要在CC2430開發(fā)平臺(tái)上使用TinyOS系統(tǒng)來(lái)開發(fā)Zigbee協(xié)議棧軟件,就必須首先對(duì)TinyOS進(jìn)行移植。

因此Chipcon公司為自己設(shè)計(jì)的ZStack協(xié)議棧中提供了一個(gè)名為操作系統(tǒng)抽象層OSAL的協(xié)議棧調(diào)度程序。

Osal主要提供如下功能:任務(wù)注冊(cè)、任務(wù)間同步互斥、中斷處理

存儲(chǔ)器分配和管理、提供定時(shí)器功能

OSAL的調(diào)度機(jī)制

協(xié)議棧調(diào)度程序(OSAL)的調(diào)度機(jī)制分為三部分:1、任務(wù)調(diào)度;2、時(shí)間管理;3、原語(yǔ)通信。

1、任務(wù)調(diào)度:osal采用一個(gè)鏈表結(jié)構(gòu)來(lái)管理協(xié)議棧各層相應(yīng)任務(wù)。相關(guān)操作函數(shù)有,添加任務(wù)到鏈表中;獲取下一個(gè)活動(dòng)任務(wù);根據(jù)taskID查找下一個(gè)任務(wù)。osal采用輪詢?nèi)蝿?wù)調(diào)度隊(duì)列(任務(wù)鏈表),通過(guò)兩個(gè)函數(shù):調(diào)度程序主循環(huán)函數(shù)和設(shè)置事件發(fā)生標(biāo)志函數(shù)。

2、時(shí)間管理:通過(guò)為事件設(shè)置超時(shí)等待時(shí)間,一旦等待時(shí)間結(jié)束,便為對(duì)應(yīng)任務(wù)設(shè)置事件發(fā)生標(biāo)志,從而達(dá)到對(duì)事件進(jìn)行延時(shí)處理目的。

3、原語(yǔ)通信:請(qǐng)求響應(yīng)原語(yǔ)操作:一旦調(diào)用了下層相關(guān)函數(shù)后,就立即返回。下層處理函數(shù)在操作結(jié)束后,將結(jié)果以消息的形式發(fā)送到上層并產(chǎn)生一個(gè)系統(tǒng)事件,調(diào)度程序發(fā)現(xiàn)這個(gè)事件后就會(huì)調(diào)用相應(yīng)的事件處理函數(shù)對(duì)它進(jìn)行處理。兩個(gè)相關(guān)函數(shù):向目標(biāo)任務(wù)發(fā)送消息的函數(shù);消息提取函數(shù)。

OSAL管理的實(shí)現(xiàn)

如果實(shí)現(xiàn)軟件和硬件的低耦合,使軟件不經(jīng)改動(dòng)或很少改動(dòng)即可應(yīng)用在另外的硬件上,這樣就方便硬件改造、升級(jí)、遷移后,軟件的移植。HAL硬件抽象層正是用來(lái)抽象各種硬件的資源,告知給軟件。其作用類似于嵌入式系統(tǒng)設(shè)備驅(qū)動(dòng)的定義硬件資源的h頭文件。

BLE低功耗藍(lán)牙系統(tǒng)架構(gòu):

軟件功能是由任務(wù)事件來(lái)實(shí)現(xiàn)的,創(chuàng)建一個(gè)任務(wù)事件需要以下工作:

1. 創(chuàng)建task identifier任務(wù)ID;2. 編寫任務(wù)初始化(task initialization routine)進(jìn)程,并需要添加到OSAL初始化進(jìn)程中,這就是說(shuō)系統(tǒng)啟動(dòng)后不能動(dòng)態(tài)添加功能;3. 編寫任務(wù)處理程序;4. 如有需要提供消息服務(wù)。BLE協(xié)議棧的各層都是以O(shè)SAL任務(wù)方式實(shí)現(xiàn),由于LL控制室的時(shí)間要求最為迫切,所以其任務(wù)優(yōu)先級(jí)最高。為了實(shí)現(xiàn)任務(wù)管理,OSAL通過(guò)消息處理(messageprocess),存儲(chǔ)管理,計(jì)時(shí)器定時(shí)等附加服務(wù)實(shí)現(xiàn)。

OSAL的系統(tǒng)啟動(dòng)流程

為了使用OSAL,在main函數(shù)的最后要啟動(dòng)一個(gè)名叫osal_start_system的進(jìn)程,該進(jìn)程會(huì)調(diào)用由特定應(yīng)用決定的啟動(dòng)函數(shù)osalInitTasks(來(lái)啟動(dòng)系統(tǒng))。osalInitTasks逐個(gè)調(diào)用BLE協(xié)議棧各層的啟動(dòng)進(jìn)程來(lái)初始化協(xié)議棧。隨后,設(shè)置一個(gè)任務(wù)的8bit任務(wù)ID(task ID),跳入循環(huán)等待執(zhí)行任務(wù),系統(tǒng)啟動(dòng)完成。1. 任務(wù)優(yōu)先級(jí)決定于任務(wù)ID,任務(wù)ID越小,優(yōu)先級(jí)越高2. BLE協(xié)議棧各層的任務(wù)優(yōu)先級(jí)比應(yīng)用程序的高3. 初始化協(xié)議棧后,越早調(diào)入的任務(wù),任務(wù)ID越高,優(yōu)先級(jí)越低,即系統(tǒng)傾向于處理新到的任務(wù)每個(gè)事件任務(wù)由對(duì)應(yīng)的16bit事件變量來(lái)標(biāo)示,事件狀態(tài)由旗號(hào)(taskflag)來(lái)標(biāo)示。如果事件處理程序已經(jīng)完成,但其旗號(hào)并沒有移除,OSAL會(huì)認(rèn)為事情還沒有完成而繼續(xù)在該程序中不返回。比如,在SimpleBLEPeripheral實(shí)例工程中,當(dāng)事件START_DEVICE_EVT發(fā)生,其處理函數(shù)SimpleBLEPeripheral_ProcessEvent就運(yùn)行,結(jié)束后返回16bit事件變量,并清除旗語(yǔ)SBP_START_DEVICE_EVT。每當(dāng)OSAL事件檢測(cè)到了有任務(wù)事件,其相應(yīng)的處理進(jìn)程將被添加到由處理進(jìn)程指針構(gòu)成的事件處理表單中,該表單名叫taskArr(taskarray)。taskArr中各個(gè)事件進(jìn)程的順序和osalInitTasks初始化函數(shù)中任務(wù)ID的順序是對(duì)應(yīng)的。有兩種,最簡(jiǎn)單的方法是使用osal_set_event函數(shù)(函數(shù)原型在OSAL.h文件中),在這個(gè)函數(shù)中,用戶可以像定義函數(shù)參數(shù)一樣設(shè)置任務(wù)ID和事件旗語(yǔ)。第二種方法是使用osal_start_timerEx函數(shù)(函數(shù)原型在OSAL_Timers.h文件中),使用方法同osal_set_event函數(shù),而第三個(gè)以毫秒為單位的參數(shù)osal_start_timerEx則指示該事件處理必須要在這個(gè)限定時(shí)間內(nèi),通過(guò)定時(shí)器來(lái)為事件處理計(jì)時(shí)。

類似于Linux嵌入式系統(tǒng)內(nèi)存分配C函數(shù)mem_alloc,OSAL利用osal_mem_alloc提供基本的存儲(chǔ)管理,但osal_mem_alloc只有一個(gè)用于定義byte數(shù)的參數(shù)。對(duì)應(yīng)的內(nèi)存釋放函數(shù)為osal_mem_free。不同的子系統(tǒng)通過(guò)OSAL的消息機(jī)制通信。消息即為數(shù)據(jù),數(shù)據(jù)種類和長(zhǎng)度都不限定。消息收發(fā)過(guò)程描述如下:

接收信息,調(diào)用函數(shù)osal_msg_allocate創(chuàng)建消息占用內(nèi)存空間(已經(jīng)包含了osal_mem_alloc函數(shù)功能),需要為該函數(shù)指定空間大小,該函數(shù)返回內(nèi)存空間地址指針,利用該指針就可把所需數(shù)據(jù)拷貝到該空間。

發(fā)送數(shù)據(jù),調(diào)用函數(shù)osal_msg_send,需為該函數(shù)指定發(fā)送目標(biāo)任務(wù),OSAL通過(guò)旗語(yǔ)SYS_EVENT_MSG告知目標(biāo)任務(wù),目標(biāo)任務(wù)的處理函數(shù)調(diào)用osal_msg_receive來(lái)接收發(fā)來(lái)的數(shù)據(jù)。建議每個(gè)OSAL任務(wù)都有一個(gè)消息處理函數(shù),每當(dāng)任務(wù)收到一個(gè)消息后,通過(guò)消息的種類來(lái)確定需要本任務(wù)做相應(yīng)處理。消息接收并處理完成,調(diào)用函數(shù)osal_msg_deallocate來(lái)釋放內(nèi)存(已經(jīng)包含了osal_mem_free函數(shù)功能)。

為了實(shí)現(xiàn)更好的移植性,協(xié)議棧將硬件層抽象出了一個(gè)HAL硬件抽象層,當(dāng)新的硬件平臺(tái)做好后,只需修改HAL,而不需修改HAL之上的協(xié)議棧的其他組件和應(yīng)用程序。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 調(diào)度機(jī)制
    +關(guān)注

    關(guān)注

    0

    文章

    4

    瀏覽量

    6774
  • OSAL
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    8739

原文標(biāo)題:一文摸清OSAL調(diào)度機(jī)制

文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    關(guān)于多功能電路模塊設(shè)計(jì)你想知道都在這

    關(guān)于多功能電路模塊設(shè)計(jì)你想知道都在這
    發(fā)表于 04-30 07:10

    存在串?dāng)_時(shí)的抖動(dòng)和定時(shí),你想知道都在這

    存在串?dāng)_時(shí)的抖動(dòng)和定時(shí),你想知道都在這
    發(fā)表于 05-07 06:56

    深度拆解MX3,你想知道都在這

    深度拆解MX3,你想知道都在這
    發(fā)表于 05-11 06:25

    關(guān)于CAN自收發(fā)程序你想知道都在這

    關(guān)于CAN自收發(fā)程序你想知道都在這
    發(fā)表于 05-20 06:01

    關(guān)于按鍵中斷你想知道都在這

    關(guān)于按鍵中斷你想知道都在這
    發(fā)表于 05-20 06:44

    關(guān)于高速ADC的選擇與應(yīng)用 你想要的都在這里

    關(guān)于高速ADC的選擇與應(yīng)用你想要的都在這里
    發(fā)表于 05-25 06:57

    關(guān)于維酷導(dǎo)熱膏你想知道都在這

    關(guān)于維酷導(dǎo)熱膏你想知道都在這
    發(fā)表于 06-08 06:30

    關(guān)于Win8你想知道都在這

    關(guān)于Win8你想知道都在這
    發(fā)表于 06-15 08:47

    關(guān)于手機(jī)無(wú)線充電你想知道都在這

    關(guān)于手機(jī)無(wú)線充電你想知道都在這
    發(fā)表于 06-16 06:33

    關(guān)于PWR的知識(shí)點(diǎn)你想知道都在這

    關(guān)于PWR的知識(shí)點(diǎn)你想知道都在這
    發(fā)表于 10-22 06:17

    關(guān)于CAN你想知道都在這

    關(guān)于CAN你想知道都在這
    發(fā)表于 11-11 06:50

    關(guān)于RS485你想知道都在這

    關(guān)于RS485你想知道都在這
    發(fā)表于 11-18 07:53

    關(guān)于HAL庫(kù)串口通信的知識(shí)點(diǎn)你想知道都在這

    關(guān)于HAL庫(kù)串口通信的知識(shí)點(diǎn)你想知道都在這
    發(fā)表于 12-08 07:00

    關(guān)于華為P10 你想知道都在這了MWC 2017 上發(fā)布!

    如今華為的新一代旗艦P10已經(jīng)確定將于西班牙當(dāng)?shù)貢r(shí)間2月26日在巴塞羅那MWC大展開幕前發(fā)布,而網(wǎng)上關(guān)于這款新品的消息也已經(jīng)是鋪天蓋地,你想知道都在這里。目前華為已經(jīng)在官方Twitter上公布了P10的預(yù)熱視頻。
    發(fā)表于 02-14 13:47 ?1729次閱讀

    關(guān)于新能源汽車與自動(dòng)駕駛,你想知道都在這里

    關(guān)于新能源汽車與自動(dòng)駕駛,你想知道都在這里。
    發(fā)表于 08-02 09:57 ?2494次閱讀