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