調(diào)度器在DSP編程中的應(yīng)用
——
關(guān)鍵字:DSP ,單片機 , 嵌入式操作系統(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指令,在一個周期內(nèi)完成一次乘法和一次加法。在國外,DSP芯片已經(jīng)被廣泛地應(yīng)用于當(dāng)今技術(shù)革命的各個領(lǐng)域;在我國,DSP技術(shù)也正以極快的速度被應(yīng)用在通信、電子系統(tǒng)、信號處理系統(tǒng)、自動控制、雷達、軍事、航空航天、醫(yī)療、家用電器、電力系統(tǒng)等許多領(lǐng)域中,而且新的應(yīng)用領(lǐng)域在不斷地被發(fā)掘。因此基于DSP技術(shù)的開發(fā)應(yīng)用正成為數(shù)字時代的應(yīng)用技術(shù)潮流。相對于單片機,它速度更快,外設(shè)集成度更高,程序存儲器更大。在《時間觸發(fā)嵌入式系統(tǒng)設(shè)計模式》一書中詳細介紹了基于單片機的軟件設(shè)計方法,而本文基于DSP對這種設(shè)計進行了擴展,使這種設(shè)計方法更為靈活,有效。
二.調(diào)度器介紹
可以從兩方面來看調(diào)度器:一方面:調(diào)度器可以看作是一個簡單的操作系統(tǒng),允許以周期性或單次方式調(diào)用任務(wù);另一方面:從底層角度來看,調(diào)度器可以看作是一個由許多不同任務(wù)共享的定時器中斷服務(wù)程序。
1. 調(diào)度器的組成
?。?)調(diào)度器數(shù)據(jù)結(jié)構(gòu)
調(diào)度器的核心是調(diào)度器數(shù)據(jù)結(jié)構(gòu)。這是一種用戶自定義的數(shù)據(jù)類型,集中了每個任務(wù)所需的信息。
typedef struct
{
void ( * pTask)(void); 指向任務(wù)的指針(必須是一個void(void)函數(shù))。
unsigned int Delay; 延時時標(biāo)數(shù):直到任務(wù)將下一次運行所剩時標(biāo)數(shù)。 時標(biāo),是硬件定時器周期中斷設(shè)定的時間間隔,它是調(diào)度器的驅(qū)動者。
unsigned int Period; 周期時標(biāo)數(shù):任務(wù)連續(xù)運行所間隔的時標(biāo)數(shù)。
unsigned int DelCounter; 若不為周期任務(wù),表示任務(wù)運行次數(shù);若為周期函數(shù),則無意義。
char PrdOrTemp; 若PrdOrTemp=1,則為周期任務(wù);若PrdOrTemp=0,則為非周期任務(wù)。
char RunMe; 當(dāng)任務(wù)需要運行時(由調(diào)度器)加1
} sTask;
另外,還需要定義一些全局變量:unsigned int Task_Index 記錄當(dāng)前所添加任務(wù)索引變量,對于每一個任務(wù)都要定義一個任務(wù)索引變量,以便對任務(wù)進行查找。例如:可以利用任務(wù)索引變量對任務(wù)進行刪除。任務(wù)隊列sTask SCH_tasks_G [SCH_MAX_TASKS]記錄所有任務(wù)數(shù)據(jù)結(jié)構(gòu)的全局變量,其中SCH_MAX_TASKS為定義的最大任務(wù)數(shù)。雖然在系統(tǒng)運行時,任務(wù)有添加或刪除,但系統(tǒng)不是很復(fù)雜,給出的SCH_MAX_TASKS一定要大于運行的任務(wù)數(shù)。
?。?) 初始化函數(shù)(void SCH_Init_T(void))
這個函數(shù)主要的作用是設(shè)置定時器,用來產(chǎn)生驅(qū)動調(diào)度器的定期時標(biāo)。一般的DSP都有多個定時器,它們中的任何一個都可以用來驅(qū)動調(diào)度器。對于調(diào)度器來說,要在不同地微處理器運行,主要是初始化函數(shù)不同(即微處理器的定時器初始化不同)。時標(biāo)設(shè)定的大小關(guān)系到CPU的利用率和系統(tǒng)的精度,它的大小與具體的系統(tǒng)有關(guān),例如微處理器的速度,執(zhí)行任務(wù)的大小,執(zhí)行任務(wù)周期的大小等。TI 公司推出的2000 系列的DSP與一般51系列的單片機時標(biāo)的設(shè)定有所不同:DSP的CPU頻率可達到40M,而且采用流水線結(jié)構(gòu),基本上一個時鐘周期執(zhí)行一條指令;一般單片機頻率為10M,而且遠不能達到一個時鐘周期執(zhí)行一條指令。在《時間觸發(fā)嵌入式系統(tǒng)設(shè)計模式》一書中,單片機時標(biāo)設(shè)定為1ms,可獲得很高的CPU利用率;而調(diào)度器應(yīng)用在交流數(shù)據(jù)采集和控制系統(tǒng)中(采用TMS320LF2407), 時標(biāo)設(shè)定為200us,CPU利用率也不小于百分之九十五。
?。?) 添加任務(wù)的函數(shù)
unsigned int SCH_Add_Task(void ( * pFunction)( DELAY, PERIOD, DELCOUNTER, PRDORTEMP)
添加任務(wù)函數(shù)首先開始檢查任務(wù)隊列sTask SCH_tasks_G[SCH_MAX_TASKS]記錄所有任務(wù)數(shù)據(jù)結(jié)構(gòu)的全局變量哪一個空閑,然后將所添加任務(wù)的地址,延時執(zhí)行時標(biāo)數(shù),周期時標(biāo)數(shù),任務(wù)運行次數(shù),周期任務(wù)指示標(biāo)志賦給任務(wù)隊列那一個空閑全局變量。再記錄下當(dāng)前任務(wù)索引變量,以便在需要的情況下賦給任務(wù)自身索引變量,對任務(wù)進行跟蹤。
(4) 刪除任務(wù)的函數(shù)
void SCH_Del_Task(const unsigned int TASK_INDEX)
刪除任務(wù)函數(shù)從 TASK_INDEX得到所要刪除任務(wù)的任務(wù)索引變量。然后將對應(yīng)的任務(wù)數(shù)據(jù)結(jié)構(gòu)的全局變量清除。刪除任務(wù)時,對應(yīng)的任務(wù)數(shù)據(jù)結(jié)構(gòu)的全局變量的內(nèi)容清除,但變量并沒有撤銷,當(dāng)再次執(zhí)行添加任務(wù)函數(shù)時,此任務(wù)數(shù)據(jù)結(jié)構(gòu)的全局變量有可能分配給其他任務(wù)。
?。?) 刷新函數(shù) void SCH_Update(void)
刷新函數(shù)是調(diào)度器的中斷服務(wù)程序,用一定的時間間隔刷新調(diào)度器。它是由定時器溢出激活的,刷新函數(shù)并不復(fù)雜。當(dāng)刷新函數(shù)確定某個任務(wù)需要運行時,將這個任務(wù)Runme標(biāo)志加一,然后該任務(wù)將由調(diào)度函數(shù)執(zhí)行。刷新函數(shù)的執(zhí)行流程如圖1所示。
(6) 調(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ù)合并,而一個任務(wù)出現(xiàn)異常在一個時標(biāo)中沒有執(zhí)行完,那么定時器中斷將被忽略,下一個任務(wù)將不能在預(yù)定的時間內(nèi)執(zhí)行。調(diào)度函數(shù)不僅可以運行所需要運行的任務(wù),而且可以刪除運行完畢的非周期任務(wù)。在調(diào)度函數(shù)中可加入一些其他功能,可以是系統(tǒng)在任務(wù)執(zhí)行完畢后沒有任務(wù)執(zhí)行是進入低功耗狀態(tài),以節(jié)省電能。調(diào)度函數(shù)的執(zhí)行流程如圖2所示。
圖1刷新函數(shù)流程圖 圖2調(diào)度函數(shù)流程圖
2. 任務(wù)的運行
任務(wù)的運行過程也是調(diào)度器運行的過程。這里調(diào)度LED兩秒閃爍一次的任務(wù)來說明任務(wù)
void LED_Flash(void)的運行過程。設(shè)定時標(biāo)為200us。系統(tǒng)初始化System_Init( ),對于任務(wù)LED_Flash(),DSP僅僅設(shè)置時鐘和相應(yīng)的I/O引腳;SCH_Init_T()前已詳細講明;添加任務(wù)函數(shù)
圖3任務(wù)運行流程圖
SCH_Add_Task(LED_Flash, 0, 5000,0,PERIOD_TASK ),其中LED_Flash為任務(wù)的地址,第一個零表示從系統(tǒng)運行第一個時標(biāo)就開始執(zhí)行任務(wù),5000表示每5000個時標(biāo)(5000
評論