1. gzyueqian
      13352868059

      嵌入式開發(fā):編寫簡單協(xié)作調(diào)度器的7個步驟

      更新時間: 2022-09-29 10:20:12來源: 粵嵌教育瀏覽量:7912

        近年來,實時操作系統(tǒng) (RTOS) 非常流行。大多數(shù)嵌入式開發(fā)工程師會在設(shè)計周期的早期選擇 RTOS,有時甚至在需求確定之前。RTOS 的一個有趣之處在于,對于許多基于 MCU 的應(yīng)用程序來說,RTOS 是多余的。當(dāng)應(yīng)用程序需要任務(wù)搶占(暫時掛起任務(wù)以切換到更高優(yōu)先級的任務(wù)并稍后恢復(fù))并且具有嚴(yán)格的實時要求時,RTOS 的魔力才真正發(fā)揮作用。在很多情況下,一個更簡單的協(xié)作調(diào)度器也能輕松滿足要求。

        協(xié)作調(diào)度器仍然允許通過使用后臺周期性定時器來調(diào)度任務(wù),該定時器創(chuàng)建系統(tǒng)滴答,就像在RTOS中一樣。不同之處在于,協(xié)作調(diào)度器不具有優(yōu)先級和搶占權(quán),而是只執(zhí)行在某個時間周期間隔發(fā)生的任務(wù)。如果兩個任務(wù)同時運(yùn)行,任務(wù)列表中位置較高的任務(wù)首先運(yùn)行,然后是第二個任務(wù),依此類推。協(xié)作調(diào)度器允許軟實時行為,但是通過使用中斷和其他機(jī)制也可以滿足硬實時需求。

        使用協(xié)作調(diào)度器的一個很大的優(yōu)點是,與RTOS相比,它們相當(dāng)簡單和直接。調(diào)試RTOS可能極其復(fù)雜,而且通常非常痛苦。另一方面,協(xié)作式調(diào)度器只有很少的幾個部分,并且更容易調(diào)試。事實上,只需幾個簡單的步驟就可以設(shè)計和實現(xiàn)一個協(xié)作調(diào)度器。它們也使用很少的閃存和RAM。

        步驟1——定義調(diào)度器要求

        嵌入式開發(fā)人員在寫任何代碼之前,了解將要寫的到底是什么是一個好主意。這通常意味著查閱項目需求文檔并理解需要什么。對于協(xié)作調(diào)度器,應(yīng)該記住一些基本要求:

        調(diào)度器應(yīng)使用單一中斷驅(qū)動定時器來跟蹤系統(tǒng)時間

        應(yīng)編寫調(diào)度器,以便可以從一個項目到下一個項目重復(fù)使用

        調(diào)度器應(yīng)能夠調(diào)度周期性和后臺任務(wù)

        調(diào)度器應(yīng)易于通過使用配置表進(jìn)行配置

        步驟2——創(chuàng)建軟件架構(gòu)

        當(dāng)開發(fā)可重用軟件時,實現(xiàn)一個好的軟件架構(gòu)是至關(guān)重要的。當(dāng)談到將在多種類型的硬件上使用的調(diào)度器時,分層的體系結(jié)構(gòu)可能是永遠(yuǎn)重用的代碼和在第一個項目后丟棄的代碼之間的區(qū)別。創(chuàng)建一個由硬件相關(guān)代碼的驅(qū)動程序?qū)印⒄{(diào)度器核心的應(yīng)用層和配置應(yīng)用程序的配置層組成的架構(gòu),效果非常好!

        

        步驟3——定義任務(wù)的組成部分

        為了正確運(yùn)行周期性任務(wù),調(diào)度器至少需要三條信息;任務(wù)連續(xù)運(yùn)行之間的時間間隔、任務(wù)最后一次執(zhí)行的系統(tǒng)節(jié)拍以及任務(wù)到期時應(yīng)該執(zhí)行的功能。有了這些信息,嵌入式開發(fā)人員就有可能定義一個C結(jié)構(gòu),用來定義處理器必須執(zhí)行的每個任務(wù)。

        步驟4–任務(wù)配置表

        一旦定義了TaskType結(jié)構(gòu),現(xiàn)在就可以創(chuàng)建一個TaskType數(shù)組,數(shù)組中的每個元素定義一個任務(wù)。對于小型應(yīng)用,該表相對較短。Tasks數(shù)組應(yīng)該定義為一個靜態(tài)變量,如果可能的話,應(yīng)該定義為const,這將有助于確保任務(wù)定義在程序執(zhí)行期間不會改變。

        步驟5——第一個任務(wù)功能

        在進(jìn)一步開發(fā)調(diào)度程序之前,最好確保任務(wù)配置表中定義的任務(wù)已經(jīng)定義。這將有助于防止編譯器因為函數(shù)沒有被定義而生氣。任務(wù)本身可以全部存儲在一個模塊中,或者按照作者的喜好存儲在單獨(dú)的模塊中。任務(wù)函數(shù)的定義就像任何其他C函數(shù)一樣。

        步驟6——一些支持配置功能

        此時,幾乎所有與任務(wù)配置相關(guān)的東西都已經(jīng)設(shè)置好了,準(zhǔn)備就緒。唯一缺少的是調(diào)度器遍歷配置表所需的兩個輔助函數(shù)。第一個,*Tsk_GetConfig,是一個函數(shù),它返回一個指向 Tasks[] 配置表的指針。這將允許調(diào)度程序訪問表結(jié)構(gòu)。第二個,Tsk_GetNumTasks,是一個函數(shù),它返回存儲在配置表中的任務(wù)數(shù)。這兩個函數(shù)之所以存在,是因為使用了良好的數(shù)據(jù)封裝編程實踐。該信息僅限于模塊范圍,嵌入式開發(fā)人員使用調(diào)度器需要這兩個輔助函數(shù)來訪問數(shù)據(jù)。

        第7步——調(diào)度器的誕生

        最后,所有部分都準(zhǔn)備就緒,可以編寫程序的實際調(diào)度器部分。協(xié)作調(diào)度器的調(diào)度算法通常直接寫在 main 函數(shù)中。調(diào)度器通過創(chuàng)建指向任務(wù)配置表的指針來初始化,還會檢索表中的任務(wù)數(shù)。

        有了這兩條信息,主循環(huán)將從檢索當(dāng)前系統(tǒng)節(jié)拍開始。在32位系統(tǒng)中,這是微不足道的工作,因為32位刻度變量的讀寫是原子性的。接下來,循環(huán)檢查任務(wù)配置表中存在的每個任務(wù)條目。如果任務(wù)的間隔設(shè)置為0(一個不斷運(yùn)行的后臺任務(wù)),則執(zhí)行該任務(wù)。另一方面,如果間隔不為0,則執(zhí)行一些數(shù)學(xué)運(yùn)算來確定任務(wù)運(yùn)行的最后時間和當(dāng)前時間之間的差是否大于或等于任務(wù)間隔。如果是,那么任務(wù)將被執(zhí)行。

        結(jié)論

        可以看出,協(xié)作調(diào)度器的實現(xiàn)非常簡單直接。沒有多少移動部件,一旦構(gòu)建了調(diào)度器,如果做得好,它可以從一個項目重用到下一個項目。嵌入式開發(fā)人員唯一需要更改的是系統(tǒng)滴答計時器,然后是任務(wù)配置表。雖然這樣一個簡單的調(diào)度器并沒有配備當(dāng)今RTOS的所有花里胡哨,但這個簡單的調(diào)度器實際上適用于多少應(yīng)用程序確實令人驚訝。

      免費(fèi)預(yù)約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 伊人久久大香线蕉综合影院首页 | 亚洲AV成人无遮挡网站在线观看 | 久热精品在线免费观看 | 曰本高清色影视频日本高 | 日韩精品色婷婷免费视频 | 日韩欧美高清中文字幕免费一区二区 |