資源描述:
《基于某nios軟核cpu地ucos-ii和lwip移植》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、實用標準文案Altera公司推出的Nios軟核CPU是一種可配置的通用精簡指令集計算RISC(ReducedInstructionSetComputing)嵌入式處理器。它可以與各種外設(shè)相結(jié)合,構(gòu)成一個定制的可編程片上系統(tǒng)SOPC(SystemonProgramableChip)。嵌入式實時操作系統(tǒng)uC/OS-II是一個非常優(yōu)秀的實時操作系統(tǒng)RTOS(RealTimeOperatingSystem),其性能已得到廣泛認可。uC/OS-II的特點有:公開的源代碼、可移植、可裁剪、可固化、搶占式內(nèi)核。T
2、CP/IP是Interenet的基本協(xié)議。嵌入式設(shè)備 要與Internet網(wǎng)絡(luò)交換信息,就必須支持TCP/IP協(xié)議。盡管uC/OS-II是一個開放源碼的RTOS,但是目前它的第三方TCP/IP支持都是商業(yè)化的,很少給出源代碼。用戶需要付費才能獲得。通過在Nios上移植uC/OS-II和開放源碼的TCP/IP協(xié)議棧-LwIP輕量級網(wǎng)絡(luò)協(xié)議(Light-weightInternetProtocol),就可以實現(xiàn)uC/OS-II的網(wǎng)絡(luò)功能,并建立一套嵌入式網(wǎng)絡(luò)開發(fā)平臺。該系統(tǒng)模型示于圖1。uC/OS-I
3、I在Nios上的移植 uC/OS-II可以看作是一個多任務(wù)的調(diào)度器,在這個任務(wù)調(diào)度器上添加了和多任務(wù)操作系統(tǒng)相關(guān)的一些系統(tǒng)服務(wù),如信號量、郵箱、消息隊列等。uC/OS-II的設(shè)計分為與處理器類型無關(guān)的代碼、與處理器類型相關(guān)的代碼和與應(yīng)用程序有關(guān)的配置代碼三部分。這也是uC/OS-II具有良好的可移植性的原因。移植工作主要集中在多任務(wù)切換的實現(xiàn)上。這部分代碼主要是用來保存和恢復處理器現(xiàn)場(即相關(guān)寄存器),因此不能用c語言,只能使用特定處理器的匯編語言完成。在Nios上移植uC/OS-II非常簡單,只
4、需修改三個和Nios體系結(jié)構(gòu)相關(guān)的文件即可。下面分別介紹這三個文件的移植工作?! ∥臋n實用標準文案1.1OS_CPU.H文件 數(shù)據(jù)類型定義這部分的移植是和所用的編譯器相關(guān)的,我們使用的編譯器是nios-elf-gcc。需要定義的數(shù)據(jù)類型包括無符號和有符號的8位、16位和32位整型變量等。 堆棧單位因為處理器現(xiàn)場的寄存器在任務(wù)切換時都將被保存在當前運行任務(wù)的堆棧中,所以O(shè)S_STK數(shù)據(jù)類型應(yīng)該與處理器的寄存器長度一致。typedefunsignedintOS_STK;堆棧增長方向堆棧由高地址向低
5、地址增長,這和選擇的編譯器有關(guān)。#defineOS_STK_GROWTH1宏定義(包括開、關(guān)中斷的宏定義,以及進行任務(wù)切換的宏定義)#defineOS_ENTER_CRITICAL()disable_interrupt();#defineOS_EXIT_CRITICAL()enable_interrupt()#defineOS_TASK_SW()OSCtxSw1.2OS_CPU_C.C文件 文檔實用標準文案該文件必須實現(xiàn)任務(wù)初始化時的堆棧設(shè)計,也就是在堆棧增長方向上如何定義每個需要保存的寄存器的位
6、置。我們將堆??臻g設(shè)計為按任務(wù)堆??臻g由高至低依次保存寄存器ra、ISTATUS、r1~r31。該文件還需要實現(xiàn)幾個操作系統(tǒng)規(guī)定的hook函數(shù)。通常都實現(xiàn)為空函數(shù)。1.3OS_CPUA.S文件(由匯編語言實現(xiàn)) (1)OSStartHighRdy()函數(shù)此函數(shù)是在OSStart()多任務(wù)啟動后,負責從最高優(yōu)先級任務(wù)的TCB控制塊中獲得該任務(wù)的堆棧指針sp,通過sp依次將CPU現(xiàn)場恢復。這時系統(tǒng)就將控制權(quán)交給用戶創(chuàng)建的該任務(wù)進程,直到該任務(wù)被阻塞或者被其他更高優(yōu)先級的任務(wù)搶占CPU。該函數(shù)僅僅在多任
7、務(wù)啟動時被執(zhí)行一次,用來啟動優(yōu)先級最高的任務(wù)執(zhí)行,以后多任務(wù)的調(diào)度和切換就由下面的函數(shù)來實現(xiàn)。 (2)OSCtxSw()函數(shù)任務(wù)級的上下文切換。它是當任務(wù)因被阻塞而主動請求CPU調(diào)度時被執(zhí)行的。它的工作是先將當前任務(wù)的CPU現(xiàn)場保存到該任務(wù)堆棧中,然后獲得最高優(yōu)先級任務(wù)的堆棧指針,從該堆棧中恢復此任務(wù)的CPU現(xiàn)場,使之繼續(xù)執(zhí)行。 (3)OSIntCtxSw()函數(shù)中斷級的任務(wù)切換,它是在ISR(中斷服務(wù)例程)中執(zhí)行任務(wù)切換。當發(fā)現(xiàn)有高優(yōu)先級任務(wù)就緒,則在中斷退出后并不返回被中斷任務(wù),而是直接調(diào)度
8、就緒的最高優(yōu)先級任務(wù)執(zhí)行。這樣做的目的是能夠盡快地讓高優(yōu)先級的任務(wù)得到響應(yīng),保證系統(tǒng)的實時性。它的原理基本上與任務(wù)級的切換相同,但是由于進入中斷時已經(jīng)保存過被中斷任務(wù)的CPU現(xiàn)場,因此這里就不用再保存?! ∥臋n實用標準文案(4)OSTickISR()函數(shù)時鐘中斷處理函數(shù)。它的主要任務(wù)是負責處理時鐘中斷,調(diào)用系統(tǒng)實現(xiàn)的OSTimeTick函數(shù),如果有等待時鐘信號的高優(yōu)先級任務(wù),則需要在中斷級別上調(diào)度其執(zhí)行?! ?5)OS_ENTER_CRITICAL()函數(shù)和OS_EX