關(guān) 閉

新聞中心

EEPW首頁 > 工控自動(dòng)化 > 設(shè)計(jì)應(yīng)用 > 調(diào)度器在DSP編程中的應(yīng)用

調(diào)度器在DSP編程中的應(yīng)用

——
作者:喬顯華 李文 時(shí)間:2006-06-28 來源: 收藏
摘要: DSP在自動(dòng)控制系統(tǒng)領(lǐng)域得到廣泛的應(yīng)用。它的性能遠(yuǎn)遠(yuǎn)強(qiáng)于單片機(jī),在控制系統(tǒng)中所完成的功能也較為復(fù)雜。若基于簡單的超循環(huán)結(jié)構(gòu)來完成軟件設(shè)計(jì),則編寫的程序繁瑣而且困難,更為重要的是系統(tǒng)有的任務(wù)精確時(shí)限得不到滿足;若使用簡單嵌入式操作系統(tǒng),則會(huì)占用非常多的資源(CPU與RAM),系統(tǒng)的實(shí)時(shí)性還有可能不滿足要求。為了把一個(gè)復(fù)雜系統(tǒng)中的任務(wù)組織起來,并且盡量減少資源的損耗,本文提出了一種軟件設(shè)計(jì)方法可滿足上述要求。

  關(guān)鍵字:DSP ,單片機(jī) , 嵌入式操作系統(tǒng)


  Attemper Application in DSP Program

  Abstract:DSP is widely used in automation system field. Its performances are much stronger than SCM, so it can complete complex functions in automation system field. If accomplish the software based on simple infinite circle, the designing is complex and difficult, more important thing is that time limit of tasks is not met; if used embedded OS , it will take up more resources(CPU and RAM) and real time quality of the system probably can not be met. In order to organize the tasks in complex system and reduce wastage of resources, this paper put forward a method of designing software that could meet above requests.

  Keywords: DSP, SCM , embedded OS




  一. DSP介紹

  DSP芯片,也稱數(shù)字信號處理器,是一種具有特殊結(jié)構(gòu)的微處理器。它的內(nèi)部采用程序和數(shù)據(jù)分開的哈佛結(jié)構(gòu),具有專門的乘法器,廣泛采用流水線結(jié)構(gòu),提供特殊的DSP指令,在一個(gè)周期內(nèi)完成一次乘法和一次加法。在國外,DSP芯片已經(jīng)被廣泛地應(yīng)用于當(dāng)今技術(shù)革命的各個(gè)領(lǐng)域;在我國,DSP技術(shù)也正以極快的速度被應(yīng)用在通信、電子系統(tǒng)、信號處理系統(tǒng)、自動(dòng)控制、雷達(dá)、軍事、航空航天、醫(yī)療、家用電器、電力系統(tǒng)等許多領(lǐng)域中,而且新的應(yīng)用領(lǐng)域在不斷地被發(fā)掘。因此基于DSP技術(shù)的開發(fā)應(yīng)用正成為數(shù)字時(shí)代的應(yīng)用技術(shù)潮流。相對于單片機(jī),它速度更快,外設(shè)集成度更高,程序存儲器更大。在《時(shí)間觸發(fā)嵌入式系統(tǒng)設(shè)計(jì)模式》一書中詳細(xì)介紹了基于單片機(jī)的軟件設(shè)計(jì)方法,而本文基于DSP對這種設(shè)計(jì)進(jìn)行了擴(kuò)展,使這種設(shè)計(jì)方法更為靈活,有效。


  二.調(diào)度器介紹

  可以從兩方面來看調(diào)度器:一方面:調(diào)度器可以看作是一個(gè)簡單的操作系統(tǒng),允許以周期性或單次方式調(diào)用任務(wù);另一方面:從底層角度來看,調(diào)度器可以看作是一個(gè)由許多不同任務(wù)共享的定時(shí)器中斷服務(wù)程序。

  1. 調(diào)度器的組成

 ?。?)調(diào)度器數(shù)據(jù)結(jié)構(gòu)

  調(diào)度器的核心是調(diào)度器數(shù)據(jù)結(jié)構(gòu)。這是一種用戶自定義的數(shù)據(jù)類型,集中了每個(gè)任務(wù)所需的信息。


  typedef struct
    {
     void ( * pTask)(void); 指向任務(wù)的指針(必須是一個(gè)void(void)函數(shù))。
     unsigned int Delay; 延時(shí)時(shí)標(biāo)數(shù):直到任務(wù)將下一次運(yùn)行所剩時(shí)標(biāo)數(shù)。       時(shí)標(biāo),是硬件定時(shí)器周期中斷設(shè)定的時(shí)間間隔,它是調(diào)度器的驅(qū)動(dòng)者。
     unsigned int Period; 周期時(shí)標(biāo)數(shù):任務(wù)連續(xù)運(yùn)行所間隔的時(shí)標(biāo)數(shù)。
     unsigned int DelCounter; 若不為周期任務(wù),表示任務(wù)運(yùn)行次數(shù);若為周期函數(shù),則無意義。
     char PrdOrTemp; 若PrdOrTemp=1,則為周期任務(wù);若PrdOrTemp=0,則為非周期任務(wù)。
     char RunMe; 當(dāng)任務(wù)需要運(yùn)行時(shí)(由調(diào)度器)加1
    } sTask;

  另外,還需要定義一些全局變量:unsigned int Task_Index 記錄當(dāng)前所添加任務(wù)索引變量,對于每一個(gè)任務(wù)都要定義一個(gè)任務(wù)索引變量,以便對任務(wù)進(jìn)行查找。例如:可以利用任務(wù)索引變量對任務(wù)進(jìn)行刪除。任務(wù)隊(duì)列sTask SCH_tasks_G [SCH_MAX_TASKS]記錄所有任務(wù)數(shù)據(jù)結(jié)構(gòu)的全局變量,其中SCH_MAX_TASKS為定義的最大任務(wù)數(shù)。雖然在系統(tǒng)運(yùn)行時(shí),任務(wù)有添加或刪除,但系統(tǒng)不是很復(fù)雜,給出的SCH_MAX_TASKS一定要大于運(yùn)行的任務(wù)數(shù)。


 ?。?) 初始化函數(shù)(void SCH_Init_T(void))

  這個(gè)函數(shù)主要的作用是設(shè)置定時(shí)器,用來產(chǎn)生驅(qū)動(dòng)調(diào)度器的定期時(shí)標(biāo)。一般的DSP都有多個(gè)定時(shí)器,它們中的任何一個(gè)都可以用來驅(qū)動(dòng)調(diào)度器。對于調(diào)度器來說,要在不同地微處理器運(yùn)行,主要是初始化函數(shù)不同(即微處理器的定時(shí)器初始化不同)。時(shí)標(biāo)設(shè)定的大小關(guān)系到CPU的利用率和系統(tǒng)的精度,它的大小與具體的系統(tǒng)有關(guān),例如微處理器的速度,執(zhí)行任務(wù)的大小,執(zhí)行任務(wù)周期的大小等。TI 公司推出的2000 系列的DSP與一般51系列的單片機(jī)時(shí)標(biāo)的設(shè)定有所不同:DSP的CPU頻率可達(dá)到40M,而且采用流水線結(jié)構(gòu),基本上一個(gè)時(shí)鐘周期執(zhí)行一條指令;一般單片機(jī)頻率為10M,而且遠(yuǎn)不能達(dá)到一個(gè)時(shí)鐘周期執(zhí)行一條指令。在《時(shí)間觸發(fā)嵌入式系統(tǒng)設(shè)計(jì)模式》一書中,單片機(jī)時(shí)標(biāo)設(shè)定為1ms,可獲得很高的CPU利用率;而調(diào)度器應(yīng)用在交流數(shù)據(jù)采集和控制系統(tǒng)中(采用TMS320LF2407), 時(shí)標(biāo)設(shè)定為200us,CPU利用率也不小于百分之九十五。


 ?。?) 添加任務(wù)的函數(shù)

  unsigned int SCH_Add_Task(void ( * pFunction)( DELAY, PERIOD, DELCOUNTER, PRDORTEMP)

  添加任務(wù)函數(shù)首先開始檢查任務(wù)隊(duì)列sTask SCH_tasks_G[SCH_MAX_TASKS]記錄所有任務(wù)數(shù)據(jù)結(jié)構(gòu)的全局變量哪一個(gè)空閑,然后將所添加任務(wù)的地址,延時(shí)執(zhí)行時(shí)標(biāo)數(shù),周期時(shí)標(biāo)數(shù),任務(wù)運(yùn)行次數(shù),周期任務(wù)指示標(biāo)志賦給任務(wù)隊(duì)列那一個(gè)空閑全局變量。再記錄下當(dāng)前任務(wù)索引變量,以便在需要的情況下賦給任務(wù)自身索引變量,對任務(wù)進(jìn)行跟蹤。


 ?。?) 刪除任務(wù)的函數(shù)

  void SCH_Del_Task(const unsigned int TASK_INDEX)

  刪除任務(wù)函數(shù)從 TASK_INDEX得到所要?jiǎng)h除任務(wù)的任務(wù)索引變量。然后將對應(yīng)的任務(wù)數(shù)據(jù)結(jié)構(gòu)的全局變量清除。刪除任務(wù)時(shí),對應(yīng)的任務(wù)數(shù)據(jù)結(jié)構(gòu)的全局變量的內(nèi)容清除,但變量并沒有撤銷,當(dāng)再次執(zhí)行添加任務(wù)函數(shù)時(shí),此任務(wù)數(shù)據(jù)結(jié)構(gòu)的全局變量有可能分配給其他任務(wù)。


 ?。?) 刷新函數(shù) void SCH_Update(void)

  刷新函數(shù)是調(diào)度器的中斷服務(wù)程序,用一定的時(shí)間間隔刷新調(diào)度器。它是由定時(shí)器溢出激活的,刷新函數(shù)并不復(fù)雜。當(dāng)刷新函數(shù)確定某個(gè)任務(wù)需要運(yùn)行時(shí),將這個(gè)任務(wù)Runme標(biāo)志加一,然后該任務(wù)將由調(diào)度函數(shù)執(zhí)行。刷新函數(shù)的執(zhí)行流程如圖1所示。


 ?。?) 調(diào)度函數(shù) void SCH_Dispatch_Tasks(void)

  調(diào)度函數(shù)是用來執(zhí)行任務(wù)的函數(shù),而刷新函數(shù)并不執(zhí)行任務(wù)。我們之所把刷新函數(shù)與調(diào)度函數(shù)分開,是處于與系統(tǒng)安全考慮的。如果刷新函數(shù)與調(diào)度函數(shù)合并,而一個(gè)任務(wù)出現(xiàn)異常在一個(gè)時(shí)標(biāo)中沒有執(zhí)行完,那么定時(shí)器中斷將被忽略,下一個(gè)任務(wù)將不能在預(yù)定的時(shí)間內(nèi)執(zhí)行。調(diào)度函數(shù)不僅可以運(yùn)行所需要運(yùn)行的任務(wù),而且可以刪除運(yùn)行完畢的非周期任務(wù)。在調(diào)度函數(shù)中可加入一些其他功能,可以是系統(tǒng)在任務(wù)執(zhí)行完畢后沒有任務(wù)執(zhí)行是進(jìn)入低功耗狀態(tài),以節(jié)省電能。調(diào)度函數(shù)的執(zhí)行流程如圖2所示。




            圖1刷新函數(shù)流程圖       圖2調(diào)度函數(shù)流程圖



  2. 任務(wù)的運(yùn)行

  任務(wù)的運(yùn)行過程也是調(diào)度器運(yùn)行的過程。這里調(diào)度LED兩秒閃爍一次的任務(wù)來說明任務(wù)
void LED_Flash(void)的運(yùn)行過程。設(shè)定時(shí)標(biāo)為200us。系統(tǒng)初始化System_Init( ),對于任務(wù)LED_Flash(),DSP僅僅設(shè)置時(shí)鐘和相應(yīng)的I/O引腳;SCH_Init_T()前已詳細(xì)講明;添加任務(wù)函數(shù)


圖3任務(wù)運(yùn)行流程圖
圖3任務(wù)運(yùn)行流程圖



  SCH_Add_Task(LED_Flash, 0, 5000,0,PERIOD_TASK ),其中LED_Flash為任務(wù)的地址,第一個(gè)零表示從系統(tǒng)運(yùn)行第一個(gè)時(shí)標(biāo)就開始執(zhí)行任務(wù),5000表示每5000個(gè)時(shí)標(biāo)(5000


評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉