4.1 μC/OS II實時操作系統的移植
μC/OS II是一種開放源碼的實時嵌入式操作系統,是一個可移植、可裁減、可固化的占先式多任務操作系統,已被應用到多種微處理器中,其大部分源碼是用ANSI C語言編寫的。移植工作包括以下幾個內容:
(1)用匯編語言改寫OS_CPU_A.ASM文件
該文件包括4個子程序:_OSStartHighRdy、OSCtxSw、OSIntCtxSw和OSTickISR。OSStartHighRdy()函數被OSStart()函數調用,功能是運行優先級最高的就緒任務;OSCtxSw()函數被OS Sched()函數調用,其功能是在任務級實現任務切換,任務切換用31號軟中斷來實現;OSIntCtxSw()函數只能在中斷子程序里被OSIntExit()函數調用,由于中斷的產生可能引起任務切換,因此在中斷服務程序的最后會調用OSIntExit()函數調用,由于中斷的產生可能引起任務切換,因此在中斷服務程序的最后會調用OSIntExit()函數來檢查任務就緒狀態,如果滿足任務切換條件(在最后一層中斷里,并有高優先級任務就緒),則OSIntExit()調用此函數實現任務切換;時鐘節拍函數OSTickISR()的功能如下:TMS320LF2407有4個通用定時器,其中斷優先級由高到低分別為T1、T3、T2、T4,可根據實際需要選擇基中的一個來實現時鐘節拍。需要注意的是:調用_OSIntEnter前不能開中斷。如果在調用_OSIntEnter前就開中斷,有可能在OSIntNesting加1前就被中斷。若發生這種情況,則當高優先級的中斷調用OSIntExit()而退出時,應直接從高優先級中斷里切換到任務,而不是反回到_OSTickISR(假設_OSTickISR是最后一層中斷),其根本原因就在于_OSTickISR還沒有來得及將OSIntNesting加1就被中斷了。在用戶的其他中斷服務程序中也應該防止此類錯誤。
(2)用C語言改寫OS CPU_C.C文件
本文件僅包括一個OSTaskStkInit()子程序。該函數可模仿TI公司的1$$SAVE庫函數對任務堆棧進行初始化,被OSTaskCreate()函數和OSTaskCreateExt()函數所調用,該函數是用來返回任務堆棧初始化后的指針值。注意:TMS320LF2407A本身的堆棧(以下簡稱US)只有8級,無法作為系統堆棧使用,所以C編譯器將其內部的二個突破口AR0,AR1保留,其中AR1作為堆棧指針SP,AR0用做堆棧中臨時變量指針FP(在匯編程序中不要使用這二個寄存器,如果必須使用,要關中斷,并注意保存和恢復)。編譯器將函數和中斷壓進US的返回地址彈出放在SP(AR1)指南的堆棧中,并保留環境,不同的是函數只保留程序要使用的寄存器,中斷要調用I$$AVE保存所有寄存器,返回時要跳轉到(而不是調用)I$$REST(這兩個函數可以在RTS.SRC中看到源代碼)恢復寄存器,這二個函數就象8068里的中斷進入和指令HRET,是移植OSTaskStkInit()函數的基礎。
(3)編寫OS_CPU.H文件
內容可根據μC/OS-II中的“80×86”的內容進行修改,這里僅給出關鍵內容:
#define OS STK GROWTH 0
#define OS ENTER CRITICAL() asm("SETC IN TM");
#define OS_EXIT CRITICAL() asm ("CLRC IN TM");
#define OS-ASKee SW() asm("INTR 31");
(4)適當OSMap Tb1[]和OSUnMapTb1[]
移植時還需要對tic /OS-II的OSMapTb1[]和O-SunMapTb1[]二個表進行適當處理,否則會出現尋址錯誤而使μC/OS-II無法正常運行,這是移植能否成功的重要因素之一。由于TMS320LF2407的存儲器采用的是哈佛結構,Flash存儲器(或外擴的ROM)位于程序區,因此,處理的方法如下:將tic /OS-II中OSMapTb1[]和OSUnMapTb1[]的數據類型從“INT8U const'改為‘INT8U’,并在鏈接器命令文件(.CMD)中將“.cinit”塊分配到Flash存儲器(或外擴的ROM中,鏈接選項用“-C”(ROM初始化)。這樣,在程序運行時將自動對數據區的RAM進行初始化,即運行時自動將“.cinit”塊中的數據復制到數據區的RAM中。
按需配置OS-FG.H,修改CPU中斷向量表和外設向量表后,其他文檔的內容可根據實際需要進行相應設置。至此,μC/OS-II在TMS320LF2407上的移植就完成了。
4.2 LAN91C111的編程
4.2.1 初始化
上電后,LAN91C111內部寄存器的值均設置為缺省值,CPU將根據需要設置其中的Configuration,Base和Individual Address寄存器,以保證電路正確工作。
4.2.2 發送數據包流程
(1)DSP向控制器發送ALLOCATE MEMORY命令(設置MMUCOM寄存器,通常設置為0x0020),MMU為待發送的包在控制器內部的packet buffer中分配存儲空間。
(2)DSP查詢Interrupt Status寄存器中的ALLOC INT位,直到該位被置成1,也可以設置Interrupt Mask中的ALLOC INT位,然后等待硬件中斷,這時,MMU已經分配好存儲空間。而且TX packet number放在Allocation Result寄存器中。(3)將Allocation Result寄存器中的packet number:拷貝到Packet Number:寄存器中,設置Pointer寄存器(設置為TX;WR,AUTOINC,即0x4000)。然后將包中數據從upper layer發送隊列傳送到控制器的Data Register。要求依次寫入Status Word、Byte Count、destination address、source address、packet size、packet data、control word。
(4)DSP向控制器發送“ENQUEUE PACKET NUMBER TO TX FIFO”命令(設置MMUCOM寄存器,通常設置0x00C0),該命令將Packet Number寄存器中的packet number拷貝到TX FIFO,說明發送的包已放入隊列中。同時設置Transmit control寄存器中的TXENA位。同時設置Transmit control寄存器中的TXENA位,啟動transmitter。到此為止,DSP的設置工作完成,它可以IDLE,直到接收到一個控制器產生的發送中斷。
(5)當控制器傳送完包以后,memory中的第一個字(16bit)被CSMA/CD寫入相應的Status Word,然后將TX FIFO中的packet number移到TX completion FIFO,當TX completion FIFO不為空時產生中斷。
(6)DSP接收到中斷后,開始執行中斷處理程序,它讀入Interrupt Status寄存器,如果產生發送中斷,則從FIFO ports寄存器讀入發送的包中的packet number,并將它寫入packet number寄存器。然后從memory中讀人Status Word(包括設置Pointer寄存器為TX、RD、AUTOINC,即0x6000,然后從數據寄存器中讀入包的Status Word),它是EPH寄存器的鏡像,再根據Status Word判斷包發送是否成功。如果成功,DSP則向控制器發送RELEASE命令(設置MMUCOM寄存器,設置為0x00A0),隨后控制器將釋放發送包所使用的存儲空間,同時設置TX INT Acknowledge寄存器,它將TX completion FIFO中的pecket unmber清除。有二種產生發送中斷的方案:每發送一個包產生一個中斷;每發送一個序列的包產生一個中斷。通過Control寄存器的Auto Release位來選擇這二種方案,而且這二種方案所使用發送中斷位也有所不同。
評論
查看更多