μC/OS-II在80x86上的移植
本章將介紹如何將μC/OS-II移植到INTEL80x86系列CPU上,本章所介紹的移植和代碼都是針對80x86的實模式的,且編譯器在大模式下編譯和連接。本章的內容同樣適用于下述CPU:
本文引用地址:http://www.104case.com/article/201610/305738.htm80186
80286
80386
80486
Pentium
PentiumII
實際上,將要介紹的移植過程適用于所有與80x86兼容的CPU,如AMD,Cyrix,NEC(V-系列)等等。以INTEL的為例只是一種更典型的情況。80x86CPU每年的產量有數百萬,大部分用于個人計算機,但用于嵌入式系統的數量也在不斷增加。最快的處理器(Pentium系列)將在2000年達到1G的工作頻率。
大部分支持80x86(實模式)的C編譯器都提供了不同的內存使用模式,每一種都有不同的內存組織方式,適用于不同規模的應用程序。在大模式下,應用程序和數據最大尋址空間為1Mb,程序指針為32位。下一節將介紹為什么32位指針只用到了其中的20位來尋址(1Mb)。
本章所介紹的內容也適用于8086處理器,但由于8086沒有PUSHA指令,移植的時候要用幾條PUSH指令來代替。
圖F9.1顯示了工作在實模式下的80x86處理器的編程模式。所有的寄存器都是16位,在任務切換時需要保存寄存器內容。
圖F9.180x86 實模式內部寄存器圖.

80x86提供了一種特殊的機制,使得用16位寄存器可以尋址1Mb地址空間,這就是存儲器分段的方法。內存的物理地址用段地址寄存器和偏移量寄存器共同表示。計算方法是:段地址寄存器的內容左移4位(乘以16),再加上偏移量寄存器(其他6個寄存器中的一個,AX,BP,SP,SI,DI或IP)的內容,產生可尋址1Mb的20位物理地址。圖F9.2表明了寄存器是如何組合的。段寄存器可以指向一個內存塊,稱為一個段。一個16位的段寄存器可以表示65,536個不同的段,因此可以尋址1,048,576字節。由于偏移量寄存器也是16位的,所以單個段不能超過64K。實際操作中,應用程序是由許多小于64K的段組成的。
圖F9.2 使用段寄存器和偏移量寄存器尋址.

代碼段寄存器(CS)指向當前程序運行的代碼段起始,堆棧段寄存器(SS)指向程序堆棧段的起始,數據段寄存器指向程序數據區的起始,附加段寄存器(ES)指向一個附加數據存儲區。每次CPU尋址的時候,段寄存器中的某一個會被自動選用,加上偏移量寄存器的內容作為物理地址。文獻中會經常發現用段地址—偏移量表示地址的方法,例如1000:00FF表示物理地址0x100FF。
9.00 開發工具
筆者采用的是BorlandC/C++V3.1和BorlandTurboAssembler匯編器完成程序的移植和測試,它可以產生可重入的代碼,同時支持在C程序中嵌入匯編語句。編譯完成后,程序可在PC機上運行。本書代碼的測試是在一臺Pentium-II計算機上完成的,操作系統是MicrosoftWindows95。實際上編譯器生成的是DOS可執行文件,在Windows的DOS窗口中運行。
只要您用的編譯器可以產生實模式下的代碼,移植工作就可以進行。如果開發環境不同,就只能麻煩您更改一下編譯器和匯編器的設置了。
9.01 目錄和文件
在安裝μC/OS-II的時候,安裝程序將把和硬件相關的,針對INTEL80x86的代碼安裝到SOFTWAREuCOS-IIIx86L目錄下。代碼是80x86實模式,且在編譯器大模式下編譯的。移植部
分的代碼可在下述文件中找到:OS_CPU.H,OS_CPU_C.C,和OS_CPU_A.ASM。
9.02 INCLUDES.H文件
INCLUDES.H是主頭文件,在所有后綴名為.C的文件的開始都包含INCLUDES.H文件。使用INCLUDES.H的好處是所有的.C文件都只包含一個頭文件,程序簡潔,可讀性強。缺點是.C文件
可能會包含一些它并不需要的頭文件,額外的增加編譯時間。與優點相比,多一些編譯時間還
是可以接受的。用戶可以改寫INCLUDES.H文件,增加自己的頭文件,但必須加在文件末尾。程
序清單L9.1是為80x86編寫的INCLUDES.H文件的內容。
程序清單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文件中包含與處理器相關的常量,宏和結構體的定義。程序清單L9.2是為80x86編寫的OS_CPU.H文件的內容。
程序清單L 9.2 OS_CPU.H.
#ifdefOS_CPU_GLOBALS
#defineOS_CPU_EXT
#else
#defineOS_CPU_EXTextern
#endif
/*
*************************************************************************
******
* 數據類型
*(與編譯器相關的內容)
*************************************************************************
******
*/
typedefunsignedcharBOOLEAN;
typedefunsignedcharINT8U;/* 無符號8位數 (1)*/
typedefsignedcharINT8S;/* 帶符號8位數 */
typedefunsignedintINT16U;/* 無符號16位數 */
typedefsignedintINT16S;/* 帶符號16位數 */
typedefunsignedlongINT32U;/* 無符號32位數 */
typedefsignedlongINT32S;/* 帶符號32位數 */
typedeffloatFP32;/* 單精度浮點數 */
typedefdoubleFP64;/* 雙精度浮點數 */
typedefunsignedintOS_STK;/* 堆棧入口寬度為16位 */
#defineBYTEINT8S/* 以下定義的數據類型是為了與uC/OSV1.xx 兼容 */
評論