關 閉

        新聞中心

        EEPW首頁 > 工控自動化 > 設計應用 > 調度器在DSP編程中的應用

        調度器在DSP編程中的應用

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

          關鍵字:DSP ,單片機 , 嵌入式操作系統


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


          二.調度器介紹

          可以從兩方面來看調度器:一方面:調度器可以看作是一個簡單的操作系統,允許以周期性或單次方式調用任務;另一方面:從底層角度來看,調度器可以看作是一個由許多不同任務共享的定時器中斷服務程序。

          1. 調度器的組成

          (1)調度器數據結構

          調度器的核心是調度器數據結構。這是一種用戶自定義的數據類型,集中了每個任務所需的信息。


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

          另外,還需要定義一些全局變量:unsigned int Task_Index 記錄當前所添加任務索引變量,對于每一個任務都要定義一個任務索引變量,以便對任務進行查找。例如:可以利用任務索引變量對任務進行刪除。任務隊列sTask SCH_tasks_G [SCH_MAX_TASKS]記錄所有任務數據結構的全局變量,其中SCH_MAX_TASKS為定義的最大任務數。雖然在系統運行時,任務有添加或刪除,但系統不是很復雜,給出的SCH_MAX_TASKS一定要大于運行的任務數。


          (2) 初始化函數(void SCH_Init_T(void))

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


          (3) 添加任務的函數

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

          添加任務函數首先開始檢查任務隊列sTask SCH_tasks_G[SCH_MAX_TASKS]記錄所有任務數據結構的全局變量哪一個空閑,然后將所添加任務的地址,延時執行時標數,周期時標數,任務運行次數,周期任務指示標志賦給任務隊列那一個空閑全局變量。再記錄下當前任務索引變量,以便在需要的情況下賦給任務自身索引變量,對任務進行跟蹤。


          (4) 刪除任務的函數

          void SCH_Del_Task(const unsigned int TASK_INDEX)

          刪除任務函數從 TASK_INDEX得到所要刪除任務的任務索引變量。然后將對應的任務數據結構的全局變量清除。刪除任務時,對應的任務數據結構的全局變量的內容清除,但變量并沒有撤銷,當再次執行添加任務函數時,此任務數據結構的全局變量有可能分配給其他任務。


          (5) 刷新函數 void SCH_Update(void)

          刷新函數是調度器的中斷服務程序,用一定的時間間隔刷新調度器。它是由定時器溢出激活的,刷新函數并不復雜。當刷新函數確定某個任務需要運行時,將這個任務Runme標志加一,然后該任務將由調度函數執行。刷新函數的執行流程如圖1所示。


          (6) 調度函數 void SCH_Dispatch_Tasks(void)

          調度函數是用來執行任務的函數,而刷新函數并不執行任務。我們之所把刷新函數與調度函數分開,是處于與系統安全考慮的。如果刷新函數與調度函數合并,而一個任務出現異常在一個時標中沒有執行完,那么定時器中斷將被忽略,下一個任務將不能在預定的時間內執行。調度函數不僅可以運行所需要運行的任務,而且可以刪除運行完畢的非周期任務。在調度函數中可加入一些其他功能,可以是系統在任務執行完畢后沒有任務執行是進入低功耗狀態,以節省電能。調度函數的執行流程如圖2所示。




                    圖1刷新函數流程圖       圖2調度函數流程圖



          2. 任務的運行

          任務的運行過程也是調度器運行的過程。這里調度LED兩秒閃爍一次的任務來說明任務
        void LED_Flash(void)的運行過程。設定時標為200us。系統初始化System_Init( ),對于任務LED_Flash(),DSP僅僅設置時鐘和相應的I/O引腳;SCH_Init_T()前已詳細講明;添加任務函數


        圖3任務運行流程圖
        圖3任務運行流程圖



          SCH_Add_Task(LED_Flash, 0, 5000,0,PERIOD_TASK ),其中LED_Flash為任務的地址,第一個零表示從系統運行第一個時標就開始執行任務,5000表示每5000個時標(5000


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 凯里市| 尉犁县| 惠东县| 兖州市| 晋州市| 永福县| 台北市| 乐东| 博客| 兴安盟| 玛沁县| 罗平县| 山东省| 冀州市| 北海市| 宿迁市| 介休市| 贞丰县| 阜宁县| 南投县| 普定县| 江北区| 铁岭县| 江安县| 深州市| 蚌埠市| 沙坪坝区| 桦甸市| 正阳县| 霸州市| 太仓市| 襄城县| 岚皋县| 九龙城区| 侯马市| 东辽县| 新竹县| 镇坪县| 北海市| 桐庐县| 尚义县|