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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

DSP實時多任務調(diào)度的解決方案

電子工程師 ? 來源:網(wǎng)絡整理 ? 作者:佚名 ? 2021-03-24 15:22 ? 次閱讀

DSP處理器是一種嵌入式處理器(embedded microprocessor),它專門用于數(shù)字信號處理,其在系統(tǒng)結構和指令算法方面進行了特殊設計,具有很高的編譯效率和指令執(zhí)行速度。

嵌入式系統(tǒng)在當今是一種非?;钴S的應用,在工業(yè)、服務業(yè)、消費電子等領域的應用范圍都不斷擴大。為了方便嵌入式系統(tǒng)的開發(fā),人們研發(fā)了許多嵌入式操作系統(tǒng),如WinCE、uc/OS、嵌入式LinuxVxWorks、pSOS、QNX、Palm OS等,由于嵌入式系統(tǒng)往往用于一些較為實時性的用途,這些操作系統(tǒng)也往往被稱為實時多任務操作系統(tǒng)(RTOS, Real Time Operation System)。這些系統(tǒng)往往被用在通用嵌入式處理器上(如ARM等)。

DSP系統(tǒng)和通用嵌入式系統(tǒng)的區(qū)別

雖然說DSP也是一種嵌入式系統(tǒng),但是由于其“專用于數(shù)字信號處理”的特點,其系統(tǒng)架構也會同通用嵌入式系統(tǒng)略有區(qū)別(當然,只是“略有區(qū)別”而已)。DSP往往用來跑高速的數(shù)學算法,而不牽涉到人機界面、數(shù)據(jù)庫、高層應用等功能(從PC角度來理解的話,DSP在一個嵌入式系統(tǒng)中的功能類似于底層驅動,例如3D圖象的演算、環(huán)繞聲的演算、網(wǎng)絡協(xié)議處理等)。

因此,從這樣的認識角度來看,DSP中的各種任務的調(diào)度在過程上相對“單純”些。DSP中的任務更加側重于“實時性”和“并行性”。實際上,對于單核的DSP芯片來說,并不可能存在真正的“并行計算”,所謂的并行只不過是通過高速切換幾個“串行的線程”來實現(xiàn)。而對于“實時性”,則要求盡可能多的將CPU時間用于計算,并且不同的線程間不能有阻塞的現(xiàn)象發(fā)生(從軟件角度看,就是執(zhí)行任務的代碼執(zhí)行時間要短,如果是復雜的算法,就需要對算法進行優(yōu)化使得算法可以“分步執(zhí)行”)。

DSP實時多任務調(diào)度的解決方案

根據(jù)以上的分析,我們可以大致的得出一個簡單的DSP RTOS的雛形,它的核心就是創(chuàng)建一種可以實時執(zhí)行的線程。這種線程被稱為“PRD Task”(period task),指的是這種線程一旦創(chuàng)建,就由系統(tǒng)內(nèi)核自動的周期性調(diào)用,而調(diào)度周期可以保證相當高的時間精度。管理這個機制的部件叫做“PRD模塊”。

創(chuàng)建PRD任務的方法是在初始化的時候向內(nèi)核注冊一個PRD任務。

int Thread_PRD_Append(long TimeSlinceCount/*執(zhí)行周期

*/,void (*CallBackHandle)()/* 函數(shù)句柄*/)

返回值: TRUE / FALSE

函數(shù)功能:向系統(tǒng)注冊一個新的線程,指定執(zhí)行周期以及需要調(diào)度的函數(shù)句柄,系統(tǒng)便會在指定的時間間隔自動調(diào)用這個函數(shù)。

這個注冊任務等待執(zhí)行的方式叫做“回調(diào)”,注冊的時候向內(nèi)核提交一個指定的執(zhí)行周期和任務函數(shù)的入口函數(shù)指針。內(nèi)核在通過計時,在達到執(zhí)行周期的時候通過函數(shù)指針調(diào)用任務函數(shù)。

內(nèi)核為了管理這個功能,需要一張“PRD任務表”。它的定義如下:

typedef struct {

long TimeSlice_Current; //當前時間片

long TimeSlice_Count; //總時間片

void (*Callback_Handle)(); //調(diào)用句柄

} Type_PRD_Table;

Type_PRD_Table PRD_Table[SYS__THREAD_PRD_TABLE_SIZE];//PRD表

int PRD_Table_ItemCount=0;//當前的PRD表最大項目數(shù)

TimeSlice_Current和TimeSlice_Count兩個變量構成了一個軟件定時器,內(nèi)核通過對于TimeSlice_Current的操作即可知道何時可以調(diào)用相關的任務函數(shù)。

相關的代碼如下。這是一個典型的減法計時器的代碼。

for(i=0;i 0)

{ PRD_Table[i].TimeSlice_Current --; //遞減時間片 }}

而在另外一處,需要判斷時間片計數(shù)器是否已經(jīng)計到0。

if((PRD_Table[i].TimeSlice_Current) == 0) {//調(diào)用相應的句柄

PRD_Table[i].TimeSlice_Current=PRD_Table[i].TimeSlice_Count;//恢復時間片

(*(PRD_Table[i].Callback_Handle))();//調(diào)用任務入口函數(shù)指針 }

接著,需要將減法計時器的代碼放入一個硬件定時器中斷中,這樣便能保證這個減法計時的高度精確性。這個硬件定時器依賴于硬件,因此要求DSP芯片硬件上必須提供這樣一個定時器,否則這個DSP內(nèi)核便無法在這個DSP芯片上執(zhí)行(幸好基本上不太會存在沒有硬件定時器的DSP)。

而對于第二段代碼,判別時間片計數(shù)是否“已經(jīng)到點”的代碼則應

當放在一個死循環(huán)中。例如在main函數(shù)中放置一個死循環(huán)。

Void Main() {

for(;;) { …。。判斷時間片計數(shù)器是否已經(jīng)計到0的代碼}

…}

顯然,除了計時是對“到點”的判別以外,我們還需要初始化和添加任務的函數(shù)。

int Thread_PRD_Append(long TimeSlinceCount,void *CallbackHandle)

{//給PRD表添加任務

if(PRD_Table_ItemCount

責任編輯:lq6

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

    關注

    0

    文章

    26

    瀏覽量

    11676
  • 計時器
    +關注

    關注

    1

    文章

    414

    瀏覽量

    32486
收藏 人收藏

    評論

    相關推薦

    鴻蒙開發(fā)接口資源調(diào)度:【@ohos.workScheduler (延遲任務調(diào)度)】

    開發(fā)者在開發(fā)應用時,通過調(diào)用延遲任務注冊接口,注冊對實時性要求不高的延遲任務,該任務默認由系統(tǒng)安排,在系統(tǒng)空閑時根據(jù)性能、功耗、熱等情況進行調(diào)度
    的頭像 發(fā)表于 06-04 10:01 ?726次閱讀
    鴻蒙開發(fā)接口資源<b class='flag-5'>調(diào)度</b>:【@ohos.workScheduler (延遲<b class='flag-5'>任務</b><b class='flag-5'>調(diào)度</b>)】

    請問CMSIS-RTOS RTX的任務調(diào)度鎖在哪里?

    請問一下,CMSIS-RTOS RTX的任務調(diào)度鎖在哪里?謝謝!
    發(fā)表于 05-13 08:28

    STM32F103 FreeRTOS任務調(diào)度異常的原因?

    ) { vTaskDelay(500); //延時函數(shù)(任務調(diào)度) printf(\"Task1rn\");//串口打印 } } void Task2_Task(void
    發(fā)表于 04-16 06:24

    介紹一種基于核集的多核嵌入式實時調(diào)度方法

    多任務環(huán)境下,嵌入式系統(tǒng)中通常運行著多于處理機數(shù)目的任務,這就要求操作系統(tǒng)能夠按照某種算法為處于就緒狀態(tài)的任務動態(tài)地分配處理機,處理機調(diào)度的實質(zhì)是對處理器資源進行分配。
    的頭像 發(fā)表于 03-05 11:31 ?522次閱讀
    介紹一種基于核集的多核嵌入式<b class='flag-5'>實時調(diào)度</b>方法

    鴻蒙OS 分布式任務調(diào)度

    鴻蒙OS 分布式任務調(diào)度概述 在 HarmonyO S中,分布式任務調(diào)度平臺對搭載 HarmonyOS 的多設備構筑的“超級虛擬終端”提供統(tǒng)一的組件管理能力,為應用定義統(tǒng)一的能力基線、
    的頭像 發(fā)表于 01-29 16:50 ?386次閱讀

    請教:有SPC560B的多任務實時系統(tǒng)的例程嗎(freertos)

    請教:有SPC560B的多任務實時系統(tǒng)的例程嗎(freertos)
    發(fā)表于 01-15 17:04

    ZMC運動控制器多任務編程一

    在工業(yè)自動化領域,多任務編程在運動控制器上得到廣泛應用。多任務編程允許將復雜的程序分解為獨立的任務,實現(xiàn)并發(fā)性和高效處理。每個任務在運動控制周期中運行,包括Motion Control
    發(fā)表于 11-07 09:52

    51單片機多任務操作系統(tǒng)的原理是什么?

    51單片機多任務操作系統(tǒng)的原理
    發(fā)表于 11-06 08:10

    Crontab:簡單實用的Python 周期任務調(diào)度工具

    任務調(diào)度工具,而且希望它盡量簡單、容易使用、不需要外部依賴,最好能夠容納 Crontab 的所有基本功能
    的頭像 發(fā)表于 11-01 09:40 ?585次閱讀

    Schedule:簡單實用的 Python 周期任務調(diào)度工具

    。 ** ** 2.當需要執(zhí)行的定時任務有上百個的時候,Crontab的 管理就會特別不方便 。 ** 另外一個選擇是 Celery,但是 Celery 的配置比較麻煩,如果你只是需要一個輕量級的調(diào)度工具,Celery
    的頭像 發(fā)表于 10-30 11:18 ?575次閱讀

    51怎么做到多任務處理而不干擾其他任務?

    51怎么做到多任務處理而不干擾其他任務
    發(fā)表于 10-30 06:33

    基于RTX51嵌入式多任務實時操作系統(tǒng)的智能卡電能表設計

    電子發(fā)燒友網(wǎng)站提供《基于RTX51嵌入式多任務實時操作系統(tǒng)的智能卡電能表設計.pdf》資料免費下載
    發(fā)表于 10-26 09:12 ?2次下載
    基于RTX51嵌入式<b class='flag-5'>多任務實時</b>操作系統(tǒng)的智能卡電能表設計

    MCU硬件看門狗+軟件看門狗監(jiān)測多任務的思路

    MCU硬件看門狗+軟件看門狗監(jiān)測多任務的思路
    的頭像 發(fā)表于 10-24 15:25 ?1656次閱讀
    MCU硬件看門狗+軟件看門狗監(jiān)測<b class='flag-5'>多任務</b>的思路

    FreeRTOS調(diào)度器介紹

    FreeRTOS是一個為嵌入式系統(tǒng)設計的開源實時操作系統(tǒng)。它提供了一個多任務內(nèi)核和一系列功能組件,適合在資源受限的設備上管理實時任務和應用程序。
    的頭像 發(fā)表于 10-17 16:08 ?517次閱讀
    FreeRTOS<b class='flag-5'>調(diào)度</b>器介紹

    什么叫多任務系統(tǒng) FreeRTOS任務管理

    的函數(shù)完成所需的處理。有時候我們也需要中斷中完成一些處理。相對于多任務系統(tǒng)而言,這個就是單任務系統(tǒng),也稱作前后臺系統(tǒng),中斷服務函數(shù)作為前臺程序,大循環(huán)while(1)作為后臺程序,如圖所示: 前后臺系統(tǒng)的實時性差,前后臺系統(tǒng)各個
    的頭像 發(fā)表于 09-28 10:56 ?552次閱讀
    什么叫<b class='flag-5'>多任務</b>系統(tǒng) FreeRTOS<b class='flag-5'>任務</b>管理