|
DSP芯片,也稱數(shù)字信號處理器,是一種具有特殊結(jié)構(gòu)的微處理器。它的內(nèi)部采用程序和數(shù)據(jù)分開的哈佛結(jié)構(gòu),具有專門的乘法器,廣泛采用流水線結(jié)構(gòu),提供特殊的DSP指令,在一個周期內(nèi)完成一次乘法和一次加法。在國外,DSP芯片已經(jīng)被廣泛地應(yī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)度器的組成 (1)調(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; 延時時標數(shù):直到任務(wù)將下一次運行所剩時標數(shù).時標,是硬件定時器周期中斷設(shè)定的時間間隔,它是調(diào)度器的驅(qū)動者。 unsigned int Period; 周期時標數(shù):任務(wù)連續(xù)運行所間隔的時標數(shù)。 unsigned int DelCounter; 若不為周期任務(wù),表示任務(wù)運行次數(shù);若為周期函數(shù),則無意義。 char PrdOrTemp; 若PrdOrTemp=1,則為周期任務(wù);若PrdOrTemp=0,則為非周期任務(wù)。 char RunMe; 當任務(wù)需要運行時(由調(diào)度器)加1 } sTask; 另外,還需要定義一些全局變量:unsigned int Task_Index 記錄當前所添加任務(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)不是很復雜,給出的SCH_MAX_TASKS一定要大于運行的任務(wù)數(shù)。 (2) 初始化函數(shù)(void SCH_Init_T(void)) 這個函數(shù)主要的作用是設(shè)置定時器,用來產(chǎn)生驅(qū)動調(diào)度器的定期時標。一般的DSP都有多個定時器,它們中的任何一個都可以用來驅(qū)動調(diào)度器。對于調(diào)度器來說,要在不同地微處理器運行,主要是初始化函數(shù)不同(即微處理器的定時器初始化不同)。時標設(shè)定的大小關(guān)系到CPU的利用率和系統(tǒng)的精度,它的大小與具體的系統(tǒng)有關(guān),例如微處理器的速度,執(zhí)行任務(wù)的大小,執(zhí)行任務(wù)周期的大小等。TI 公司推出的2000 系列的DSP與一般51系列的單片機時標的設(shè)定有所不同:DSP的CPU頻率可達到40M,而且采用流水線結(jié)構(gòu),基本上一個時鐘周期執(zhí)行一條指令;一般單片機頻率為10M,而且遠不能達到一個時鐘周期執(zhí)行一條指令。在《時間觸發(fā)嵌入式系統(tǒng)設(shè)計模式》一書中,單片機時標設(shè)定為1ms,可獲得很高的CPU利用率;而調(diào)度器應(yīng)用在交流數(shù)據(jù)采集和控制系統(tǒng)中(采用TMS320LF2407), 時標設(shè)定為200us,CPU利用率也不小于百分之九十五。 (3) 添加任務(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í)行時標數(shù),周期時標數(shù),任務(wù)運行次數(shù),周期任務(wù)指示標志賦給任務(wù)隊列那一個空閑全局變量。再記錄下當前任務(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)容清除,但變量并沒有撤銷,當再次執(zhí)行添加任務(wù)函數(shù)時,此任務(wù)數(shù)據(jù)結(jié)構(gòu)的全局變量有可能分配給其他任務(wù)。 (5) 刷新函數(shù) void SCH_Update(void) 刷新函數(shù)是調(diào)度器的中斷服務(wù)程序,用一定的時間間隔刷新調(diào)度器。它是由定時器溢出激活的,刷新函數(shù)并不復雜。當刷新函數(shù)確定某個任務(wù)需要運行時,將這個任務(wù)Runme標志加一,然后該任務(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)異常在一個時標中沒有執(zhí)行完,那么定時器中斷將被忽略,下一個任務(wù)將不能在預定的時間內(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所示。 2. 任務(wù)的運行 任務(wù)的運行過程也是調(diào)度器運行的過程。這里調(diào)度LED兩秒閃爍一次的任務(wù)來說明任務(wù)void LED_Flash(void)的運行過程。設(shè)定時標為200us。系統(tǒng)初始化System_Init( ),對于任務(wù)LED_Flash(),DSP僅僅設(shè)置時鐘和相應(yīng)的I/O引腳;SCH_Init_T()前已詳細講明;添加任務(wù)函數(shù) SCH_Add_Task(LED_Flash, 0, 5000,0,PERIOD_TASK ),其中LED_Flash為任務(wù)的地址,第一個零表示從系統(tǒng)運行第一個時標就開始執(zhí)行任務(wù),5000表示每5000個時標(5000×200us=1s)執(zhí)行一次任務(wù),PERIOD_TASK表示這是一個周期任務(wù),第二個零周期任務(wù)時無意義;啟動定時器SCH_Start(),注意添加任務(wù)后再啟動定時器;進入超循環(huán)(即while(1){}語句)執(zhí)行調(diào)度函數(shù)SCH_Dispatch_Tasks(),任務(wù)LED_Flash()在其中被執(zhí)行:點亮或熄滅LED;任務(wù)執(zhí)行完畢,定時器中斷到來時,進入中斷并立刻對定時器清零,以保證時標的精確,再執(zhí)行刷新函數(shù)SCH_Update(),然后中斷返回執(zhí)行調(diào)度函數(shù) SCH_Dispatch_Tasks()。 三. 應(yīng)用 在V/F控制異步電動機調(diào)速系統(tǒng)中,用運調(diào)度器對程序進行編程,實現(xiàn)了對電機的開環(huán)控制。 主程序部分代碼: Void Main.c(void) { System_init(); 系統(tǒng)初始化 Sch_init_t1();調(diào)度器初始化 AD——Sample();電流、電壓采樣 Svpwm_init();SVPWM波生成初始化 Led_flash_update();刷新函數(shù) Sch_add_task(led_flash_update,0,1000);添加任務(wù)1 Sch_add_task(uf_control,0,1);添加任務(wù)2 Ash_add_task(svpwm_control,0,1);添加任務(wù)3 Sch_start(); While(1) { Sch_dispatch_tasks(); 執(zhí)行任務(wù) } 中斷程序略。 } 四. 總結(jié) 這種調(diào)度器的特點首先是結(jié)構(gòu)簡單,運行安全可靠:調(diào)度器的大小只有450個字,分配給每個任務(wù)的RAM也只有6個字;其次,由于調(diào)度器很小,運行時間很短,CPU的利用率高;簡化軟件設(shè)計。在直接轉(zhuǎn)矩控制系統(tǒng)中(采用TMS320LF2407A)已使用這種調(diào)度器進行軟件設(shè)計,在仔細設(shè)計的前提下系統(tǒng)是可以非常可靠運行:首先,必須知道每個任務(wù)運行的最長時間,而所有任務(wù)運行最長時間的總和最好小于時標,這樣最為安全,而實際中常常達不到這樣要求,那么就讓周期的任務(wù)在不同的時標中運行;其次,任務(wù)的大小可能參差不齊,有時還可能相差較大,這就要根據(jù)實際情況把大任務(wù)分解成小任務(wù)或把小任務(wù)合并為大任務(wù)。 |