新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > μC/OS-II在80x86上的移植

        μC/OS-II在80x86上的移植

        作者: 時間:2016-10-08 來源:網絡 收藏

        本章將介紹如何將μC/OS-II移植到INTEL80x86系列CPU上,本章所介紹的移植和代碼都是針對80x86的實模式的,且編譯器在大模式下編譯和連接。本章的內容同樣適用于下述CPU:

        本文引用地址:http://www.104case.com/article/201610/305738.htm

        80186

        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 兼容 */


        上一頁 1 2 3 4 5 6 7 8 9 下一頁

        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 建德市| 合江县| 鹤壁市| 尼玛县| 礼泉县| 子长县| 方山县| 大城县| 镇安县| 鹰潭市| 灵山县| 乌鲁木齐县| 石首市| 高淳县| 卢氏县| 昌乐县| 灵山县| 中方县| 曲靖市| 红安县| 济宁市| 东乡县| 永宁县| 甘肃省| 余姚市| 大理市| 寿宁县| 阜城县| 衡南县| 漾濞| 建平县| 临高县| 赤峰市| 湘乡市| 开阳县| 中卫市| 汽车| 乌拉特中旗| 罗山县| 郧西县| 渑池县|