新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > μCOSII在Cortex-M3核ARM處理器上的移植

        μCOSII在Cortex-M3核ARM處理器上的移植

        作者: 時間:2009-03-30 來源:網絡 收藏

        程序

        程序

          由于微處理器在進入中斷時按堆棧增長方向自動順序保存了如下8個寄存器:xPSR、PC、LR、R12、R3、R2、R1、R0,因此在程序中只須保存另外8個寄存器,保存順序可以隨意,但注意彈棧時要按照先進后出的方式進行。按照本文開頭的假定,任務總是運行在線程模式的特權方式下且總是使用堆棧指針PSP。而中斷產生后,中斷服務程序將處于處理模式下,并且默認使用的堆棧指針是MSP。因此在保存堆棧指針的時候需要保存的是當前任務的PSP。中斷返回前新任務的堆棧指針需要恢復到PSP中。中斷返回使用如下指令

          MOVrO,#Oxfffffffd

          BXr0

          其中立即數#0xfffffffd包含了返回信息,用這兩條指令可以使中斷返回時使用任務堆棧指針PSP,返回后任務處于線程模式且使用任務堆棧指針PSP。

          第三個匯編語言函數OSIntCtxSw與OSCtxSw類似。若任務執行過程中產生了中斷,且中斷服務程序使得一個比當前被中斷的任務具有更高優先級的任務就緒時,μCOS—II內核就會在中斷返回之前調用函數OSIntCtxSw。在此函數中不需要像任務級任務切換函數那樣保存當前任務狀態,因為當前任務已經被中斷,在進入中斷服務程序的時候任務狀態已被保存。其源代碼與函數OSctxSw中保存當前任務堆棧PSP指令以后部分相同,此處不再列出。

          第4個匯編語言函數OSTickISR是系統時鐘節拍的中斷服務函數。處理器STM32F103VBT6中有一個專用系統時鐘節拍定時器SysTick,本過程使用此定時器產生每100 ms一次的時鐘節拍中斷。此函數源代碼如下

        程序

          3 程序開發模式討論

          傳統應用程序開發模式稱為超循環模式,即通常主程序是由C語言中的for語句或while語句構成的一個無限循環,程序在此循環中檢測事件的發生,從而轉向不同的任務。這種程序開發模式有兩個主要的不足之處。首先從程序維護和可靠性的角度來看,所有任務都需要程序開發人員來進行全局性的維護,當系統變得龐大和復雜時,任務的維護會變得非常麻煩,同時程序的可靠性也受到影響。其次,從任務級響應時間來看,這個時間是不確定的,因為程序在循環體中檢測事件發生的位置是固定的,但事件的發生是隨機的,因此從事件發生到程序檢測到事件發生這段時間也是不確定的。

          在基于嵌入式操作系統的應用程序開發過程中,應用程序開發人員只需關心各個任務本身,而任務調度由操作系統代勞。以下的例子說明了基于μCOS—II嵌入式操作系統的應用程序開發模式

        程序

          其中函數SysInit的作用是根據具體應用對處理器芯片進行必要的初始化,例如對系統的時鐘分配以及通用輸入輸出端口配置。函數OSInit是μCOS—II操作系統的內核初始化程序。第一個OSTaskCreate函數創建了任務Taskl,此任務的入口地址是Taskl,優先級是0。第二個OSTaskCreate函數創建了任務Task2,此任務的入口地址是Task2,優先級是1。函數OSTaskCrate還會將其創建的任務置于就緒態。文獻敘述了函數OSTa-skCreate的各個參數的含義。函數OSStart用于啟動多任務調度。OSTimeDly是μCOS—II內核提供的系統調用函數,用于延時或定時,這里的參數5表示延時5個時鐘節拍。應用程序開發人員需要做的就是通過調用μCOS—II內核提供的任務創建函數OSTaskCreate將編寫好的任務程序交給操作系統管理。

          該例中在調用OSStart后,操作系統發現任務Taskl的優先級最高,于是操作系統就調度任務Taskl使其投入運行,而任務Task2暫時不能獲得處理器的使用權。任務Taskl首先點亮一個LED,然后延時一段時間,當運行到OSTimeDly處時,該任務被掛起而處于等待狀態,此時任務Task2成為優先級最高的就緒態任務,于是操作系統調度Task2運行。當5個時鐘節拍的延時時間結束時,系統時間節拍中斷服務子程序會重新將任務Taskl置于就緒狀態,此時任務Taskl再一次成為優先級最高的就緒態任務,于是操作系統保存任務Task2的狀態,并恢復任務Taskl的狀態使其又一次獲得處理器的使用權。此后程序執行過程將重復上述步驟。可以看到,在這個例子中的現象是某個LED燈不停的閃爍。

          μCOS—II操作系統內核是實時可剝奪型的,這意味著在任務執行過程中或中斷服務子程序中,一旦有一個新的更高優先級的任務就緒,內核將立刻調度此新任務運行,這說明響應任務的時間是即刻的、確定的。

          綜上所述,基于嵌入式操作系統的應用程序開發過程相對于以往傳統應用程序開發大為簡化而且任務級響應時間也得到最優化。

          4 結束語

          通過將過程中修改的μCOS—II內核代碼與上述例子中的應用程序代碼在μVision3集成開發環境中編輯整合后進行編譯、鏈接并且下載到目標硬件平臺進行長時間觀察,發現LED不停的閃爍,說明本過程是成功的。


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 图木舒克市| 衡阳县| 沙洋县| 徐闻县| 富阳市| 云林县| 株洲县| 芮城县| 丘北县| 临漳县| 鄂州市| 股票| 榆社县| 柳林县| 胶南市| 普格县| 双牌县| 大竹县| 盐源县| 松滋市| 屏南县| 新宾| 桓台县| 浙江省| 松滋市| 宁城县| 稻城县| 梁山县| 武乡县| 冷水江市| 蕲春县| 博客| 沂南县| 班玛县| 东丰县| 儋州市| 新竹县| 河西区| 万载县| 临漳县| 侯马市|