1. gzyueqian
      18078865874
      首頁 > 新聞中心 > > 正文

      uC/OS-II在ARM上的移植體會

      更新時間: 2007-06-28 10:43:57來源: 粵嵌教育瀏覽量:767

        移植uc/os-ii 的絕大部分工作都集中在os_cpu_a.s 文件的移植,這個文件的實現集中體現了所要移植到處理器的體系結構和uc/os-ii 的移植原理;在這個文件里,困難的工作又集中體現在osintctxsw 和ostickisr 這兩個函數的實現上。這是因為這兩個函數的實現是和移植者的移植思路以及相關硬件定時器、中斷寄存器的設置有關。在實際的移植工作中,這兩個地方也是比較容易出錯的地方。

        osintctxsw 重要的作用就是它完成了在中斷isr 中直接進行任務切換,從而提高了實時響應的速度。它發生的時機是在isr 執行到osintexit 時,如果發現有高優先級的任務因為等待的time tick 到來獲得了執行的條件,這樣就可以馬上被調度執行,而不用返回被中斷的那個任務之后再進行任務切換,因為那樣的話就不夠實時了。

        實現osintctxsw 的方法大致也有兩種情況:一種是通過調整sp 堆棧指針的方法,根據所用的編譯器對于函數嵌套的處理,通過精確計算出所需要調整的sp 位置來使得進入中斷時所作的保存現場的工作可以被重用。這種方法的好處是直接在函數嵌套內部發生任務切換,使得高優先級的任務能夠快的被調度執行。但是這個辦法需要和具體的編譯器以及編譯參數的設置相關,需要較多技巧。另一種是設置需要切換標志位的方法,在osintctxsw 里面不發生切換,而是設置一個需要切換的標志,等函數嵌套從進入osintexit => os_enter_critical() =>osintctxsw() => os_exit_critical() => osintexit 退出后,再根據標志位來判斷是否需要進行中斷級的任務切換。這種方法的好處是不需要考慮編譯器的因素,也不用做計算,但是從實時響應上不是快,不過剛開始學習這種方法比較容易理解,實現起來也簡單。

        在中斷態下進行任務切換,需要特別說明的一個問題是如何獲得被中斷任務的lr_svc 。因為進入中斷態后,lr 變成了lr_irq ,原來任務的lr_svc 無法在中斷態下獲得,這樣要得到lr_svc ,就必須在中斷isr 里面進行一次cpu mode 強制轉換,即對cpsr 賦值為0x000000d3 ,只有返回到svc 態之后才能得到原來任務的lr ,這個對于任務切換很重要。還有一個需要留意的問題是在強制cpsr 變成svc 態之后,spsr 也會相應地變成spsr_irq ,這樣就需要在強制轉變之前保存spsr ,也就是被中斷任務中斷前的cpsr 。

      ----------------------------------------------
      對于一種開發工具的學習,重要也困難的階段就是概念的建立,只要建立了正確的概念,明白整個系統的體系結構和各種工具作用,剩下的工作就是實際操作,積累經驗了,多不過在需要的時候查一查手冊。
      --------------------------------------------------------------------------------

        uc/os-ii移植關鍵函數說明

        osstarthighrdy()

        此函數是在osstart()多任務啟動之后,負責從優先級任務的tcb 控制塊中獲得該任務的堆棧指針sp,通過sp 依次將cpu 現場恢復,這時系統就將控制權交給用戶創建的該任務進程,直到該任務被阻塞或者被其他更高優先級的任務搶占cpu。該函數僅僅在多任務啟動時被執行一次,用來啟動個,也就是優先級的任務執行,之后多任務的調度和切換就是由下面的函數來實現。

        osctxsw()

        任務級的上下文切換,它是當任務因為被阻塞而主動請求cpu 調度時被執行,由于此時的任務切換都是在非異常模式下進行的,因此區別于中斷級別的任務切換。它的工作是先將當前任務的cpu 現場保存到該任務堆棧中,然后獲得優先級任務的堆棧指針,從該堆棧中恢復此任務的cpu 現場,使之繼續執行。這樣就完成了一次任務切換。

        osintctxsw()

        中斷級的任務切換,它是在時鐘中斷isr(中斷服務例程)中發現有高優先級任務等待的時鐘信號到來,則需要在中斷退出后并不返回被中斷任務,而是直接調度就緒的高優先級任務執行。這樣做的目的主要是能夠盡快地讓高優先級的任務得到響應,保證系統的實時性能。它的原理基本上與任務級的切換相同,但是由于進入中斷時已經保存過了被中斷任務的cpu 現場,因此這里就不用再進行類似的操作,只需要對堆棧指針做相應的調整,原因是函數的嵌套。

        ostickisr()

        時鐘中斷處理函數,它的主要任務是負責處理時鐘中斷,調用系統實現的ostimetick函數,如果有等待時鐘信號的高優先級任務,則需要在中斷級別上調度其執行。其他相關的兩個函數是osintenter()和osintexit(),都需要在isr 中執行。

        armenableint()& armdisableint()

        分別是退出臨界區和進入臨界區的宏指令實現。主要用于在進入臨界區之前關閉中斷,在退出臨界區的時候恢復原來的中斷狀態。它的實現比較簡單,可以采用方法1 直接開關中斷來實現,也可以采用方法2 通過保存關閉/恢復中斷屏蔽位來實現。

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 亚洲中文字幕aⅴ天堂自拍 思思热精品在线8 | 永久性国产盗摄在线观看 | 久热精品视频在线 | 亚洲欧美激情在线一区 | 日韩中文无线码在线视频观看 | 日本久久中文字幕 |