a一级爱做片免费观看欧美,久久国产一区二区,日本一二三区免费,久草视频手机在线观看

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > 在AndesCore N1033A-S處理器實現μC/OS-II的移植

在AndesCore N1033A-S處理器實現μC/OS-II的移植

作者: 時間:2012-03-20 來源:網絡 收藏

3.2相關部分匯編

μC/OS-Ⅱ的需要用戶編寫三個最基本的匯編語言函數:OSStartHighRdy(),OSCtxSw(),OSIntCtxSw()。它們會共用一些代碼,為了方便閱讀將它們寫在同一個匯編文件os_cpu_a.S中。

3.2.1 OSStartHighRdy():運行優先級最高的就緒任務。

OSStartHighRdy()函數是在OSStart()多任務啟動之后,負責從最高優先級任務的TCB控制塊中獲得該任務的堆棧指針SP,并通過SP恢復CPU現場以啟動最高優先級的任務執行。另外OSStartHighRdy()還必須在最高優先級任務恢復之前和調用OSTaskSwHook()之后設置OSRunning為TRUE.其代碼如下:

3.2.2 OSCtxSw()和OSIntCtxSw()

OSCtxSw()是任務優先級切換函數,它的作用是先將當前任務的CPU現場保存到該任務的堆棧中,然后獲得最高優先級任務的堆棧指針,并從該堆棧中恢復此任務的CPU現場,使之繼續執行,該函數就完成了一次任務切換。

OSIntCtxSw()是中斷級的任務切換函數。由于中斷可能會使更高優先級的任務進入就緒態,因此為了讓更高優先級的任務能立即運行,在中斷服務子程序最后會調用OSIntCtxSw()做任務切換。這樣做能夠盡快的讓高優先級的任務得到相應的處理,保證系統的實時性能。

OSCtxSw()和OSIntCtxSw()都是用于任務切換的函數,其區別在于,在OSIntCtxSw()中無需再保存寄存器,因為在OSIntCtxSw()之前已發生中斷,所以可以保證所有的寄存器都被正確地保存到了被中斷的任務的堆棧之中。OSCtxSw()和OSIntCtxSw()代碼如下:

處理器定義了四級(0-3)中斷,在各級中斷的轉換時需要保存當前中斷層級的寄存器。調用OSCtxSw()時,中斷將由0級(即沒有中斷)轉到1級,所以需要將第0級的寄存器PSW和PC保存到第1級的寄存器IPSW和IPC中。CtxSave和CtxRestore兩個宏用來保存和恢復任務上下文。需要保存或恢復的寄存器包括32個通用寄存器(R0-R31)的值、程序計數器(PC)的值以及處理器狀態字寄存器(PSW)的值。宏IntlSwitch n通過修改PSW.INIT的值來切換中斷層級。CtxSave和IntlSwitch的匯編實現如下(由于CtxRestore與CtxSave過程類似,這里不做贅述):

3.3 C語言編寫的幾個與操作系統相關的函數

μC/OS-Ⅱ有六個與CPU相關的函數:OSTaskStkInit()、OSTaskCreateHook()、OSTaskDelHook()、OSTaskSwHook()、OSTaskStatHook()、OSTimeTickHook(),它們被定義在ucos_ii.h中。其中唯一必須的函數是任務堆棧初始化函數OSTaskStkInit(),其它五個函數必須得聲明但沒必要包含代碼。因此這里我們只介紹OSTaskStkInit(),其代碼的實現如下:

OSTaskStkInit()在任務創建時被調用,負責初始化任務的堆棧結構并返回新堆棧的指針,使得堆棧看起來就像剛發生過中斷并將所有的寄存器保存到堆棧中的情形一樣。除了要保存任務的地址、變量的指針以及處理器狀態字的值外,Andes 處理器還要求用戶保存所有32個通用寄存器(R0-R31)、四個用戶寄存器(d0.hi, d0.lo, d1.hi, d1.lo)。還有一點需要注意,在處理器中,堆棧指針的地址必須滿足8Byte對齊,程序最后一段邏輯即將堆棧指針調整到正確的位置,這一點在編寫其他代碼例如在宏CtxSave中同樣需要注意。

4. 結語

基于AndesStar?架構的優勢,可以很容易的實現μC/OS-Ⅱ在N1033A-S處理器上的移植。不僅μC/OS-Ⅱ,其它嵌入式操作系統也可以很方便地移植到?相應的處理器上,例如Nuclues、FreeRTOS以及Contiki。

晶心科技利用 ? N1033A-S高效能的 Audio ISA 和 FPGA開發平臺彈性的設計架構,基于各種RTOS,為客戶提供了的豐富的軟件資源(中間件、優化的函數庫、應用實例等)以及完整的多媒體語音解決方案,從而幫助客戶更快地在Andes平臺上進行產品開發。


上一頁 1 2 下一頁

評論


相關推薦

技術專區

關閉