μC/OS-II在80x86上的移植
本章將介紹如何將μC/OS-II移植到INTEL80x86系列CPU上,本章所介紹的移植和代碼都是針對(duì)80x86的實(shí)模式的,且編譯器在大模式下編譯和連接。本章的內(nèi)容同樣適用于下述CPU:
本文引用地址:http://www.ex-cimer.com/article/201610/305738.htm80186
80286
80386
80486
Pentium
PentiumII
實(shí)際上,將要介紹的移植過程適用于所有與80x86兼容的CPU,如AMD,Cyrix,NEC(V-系列)等等。以INTEL的為例只是一種更典型的情況。80x86CPU每年的產(chǎn)量有數(shù)百萬(wàn),大部分用于個(gè)人計(jì)算機(jī),但用于嵌入式系統(tǒng)的數(shù)量也在不斷增加。最快的處理器(Pentium系列)將在2000年達(dá)到1G的工作頻率。
大部分支持80x86(實(shí)模式)的C編譯器都提供了不同的內(nèi)存使用模式,每一種都有不同的內(nèi)存組織方式,適用于不同規(guī)模的應(yīng)用程序。在大模式下,應(yīng)用程序和數(shù)據(jù)最大尋址空間為1Mb,程序指針為32位。下一節(jié)將介紹為什么32位指針只用到了其中的20位來尋址(1Mb)。
本章所介紹的內(nèi)容也適用于8086處理器,但由于8086沒有PUSHA指令,移植的時(shí)候要用幾條PUSH指令來代替。
圖F9.1顯示了工作在實(shí)模式下的80x86處理器的編程模式。所有的寄存器都是16位,在任務(wù)切換時(shí)需要保存寄存器內(nèi)容。
圖F9.180x86 實(shí)模式內(nèi)部寄存器圖.
80x86提供了一種特殊的機(jī)制,使得用16位寄存器可以尋址1Mb地址空間,這就是存儲(chǔ)器分段的方法。內(nèi)存的物理地址用段地址寄存器和偏移量寄存器共同表示。計(jì)算方法是:段地址寄存器的內(nèi)容左移4位(乘以16),再加上偏移量寄存器(其他6個(gè)寄存器中的一個(gè),AX,BP,SP,SI,DI或IP)的內(nèi)容,產(chǎn)生可尋址1Mb的20位物理地址。圖F9.2表明了寄存器是如何組合的。段寄存器可以指向一個(gè)內(nèi)存塊,稱為一個(gè)段。一個(gè)16位的段寄存器可以表示65,536個(gè)不同的段,因此可以尋址1,048,576字節(jié)。由于偏移量寄存器也是16位的,所以單個(gè)段不能超過64K。實(shí)際操作中,應(yīng)用程序是由許多小于64K的段組成的。
圖F9.2 使用段寄存器和偏移量寄存器尋址.
代碼段寄存器(CS)指向當(dāng)前程序運(yùn)行的代碼段起始,堆棧段寄存器(SS)指向程序堆棧段的起始,數(shù)據(jù)段寄存器指向程序數(shù)據(jù)區(qū)的起始,附加段寄存器(ES)指向一個(gè)附加數(shù)據(jù)存儲(chǔ)區(qū)。每次CPU尋址的時(shí)候,段寄存器中的某一個(gè)會(huì)被自動(dòng)選用,加上偏移量寄存器的內(nèi)容作為物理地址。文獻(xiàn)中會(huì)經(jīng)常發(fā)現(xiàn)用段地址—偏移量表示地址的方法,例如1000:00FF表示物理地址0x100FF。
9.00 開發(fā)工具
筆者采用的是BorlandC/C++V3.1和BorlandTurboAssembler匯編器完成程序的移植和測(cè)試,它可以產(chǎn)生可重入的代碼,同時(shí)支持在C程序中嵌入?yún)R編語(yǔ)句。編譯完成后,程序可在PC機(jī)上運(yùn)行。本書代碼的測(cè)試是在一臺(tái)Pentium-II計(jì)算機(jī)上完成的,操作系統(tǒng)是MicrosoftWindows95。實(shí)際上編譯器生成的是DOS可執(zhí)行文件,在Windows的DOS窗口中運(yùn)行。
只要您用的編譯器可以產(chǎn)生實(shí)模式下的代碼,移植工作就可以進(jìn)行。如果開發(fā)環(huán)境不同,就只能麻煩您更改一下編譯器和匯編器的設(shè)置了。
9.01 目錄和文件
在安裝μC/OS-II的時(shí)候,安裝程序?qū)押陀布嚓P(guān)的,針對(duì)INTEL80x86的代碼安裝到SOFTWAREuCOS-IIIx86L目錄下。代碼是80x86實(shí)模式,且在編譯器大模式下編譯的。移植部
分的代碼可在下述文件中找到:OS_CPU.H,OS_CPU_C.C,和OS_CPU_A.ASM。
9.02 INCLUDES.H文件
INCLUDES.H是主頭文件,在所有后綴名為.C的文件的開始都包含INCLUDES.H文件。使用INCLUDES.H的好處是所有的.C文件都只包含一個(gè)頭文件,程序簡(jiǎn)潔,可讀性強(qiáng)。缺點(diǎn)是.C文件
可能會(huì)包含一些它并不需要的頭文件,額外的增加編譯時(shí)間。與優(yōu)點(diǎn)相比,多一些編譯時(shí)間還
是可以接受的。用戶可以改寫INCLUDES.H文件,增加自己的頭文件,但必須加在文件末尾。程
序清單L9.1是為80x86編寫的INCLUDES.H文件的內(nèi)容。
程序清單L 9.1 INCLUDES.H.
#include
#include
#include
#include
#include
#include
#include
#includesoftwareucos-iiix86los_cpu.h
#includeos_cfg.h
#includesoftwareblockspcsourcepc.h
#includesoftwareucos-iisourceucos_ii.h
9.03 OS_CPU.H文件
OS_CPU.H文件中包含與處理器相關(guān)的常量,宏和結(jié)構(gòu)體的定義。程序清單L9.2是為80x86編寫的OS_CPU.H文件的內(nèi)容。
程序清單L 9.2 OS_CPU.H.
#ifdefOS_CPU_GLOBALS
#defineOS_CPU_EXT
#else
#defineOS_CPU_EXTextern
#endif
/*
*************************************************************************
******
* 數(shù)據(jù)類型
*(與編譯器相關(guān)的內(nèi)容)
*************************************************************************
******
*/
typedefunsignedcharBOOLEAN;
typedefunsignedcharINT8U;/* 無符號(hào)8位數(shù) (1)*/
typedefsignedcharINT8S;/* 帶符號(hào)8位數(shù) */
typedefunsignedintINT16U;/* 無符號(hào)16位數(shù) */
typedefsignedintINT16S;/* 帶符號(hào)16位數(shù) */
typedefunsignedlongINT32U;/* 無符號(hào)32位數(shù) */
typedefsignedlongINT32S;/* 帶符號(hào)32位數(shù) */
typedeffloatFP32;/* 單精度浮點(diǎn)數(shù) */
typedefdoubleFP64;/* 雙精度浮點(diǎn)數(shù) */
typedefunsignedintOS_STK;/* 堆棧入口寬度為16位 */
#defineBYTEINT8S/* 以下定義的數(shù)據(jù)類型是為了與uC/OSV1.xx 兼容 */
評(píng)論