新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于μC/OS-Ⅱ在ARM7上移植方法的探討與實現

        基于μC/OS-Ⅱ在ARM7上移植方法的探討與實現

        作者: 時間:2012-11-30 來源:網絡 收藏

          includes.h 系統頭文件,整個實時系統程序所需要的文件,包括了內核和用戶的頭文件,這樣使得用戶項目中的每個.c文件不用分別去考慮他實際上需要哪些頭文件。

          3.2 與處理器相關的代碼

          這是移植中最關鍵的部分。內核將應用系統和底層硬件有機地結合成一個實時系統,要使同一個內核能適用于不同的硬件體系,就需要在內核和硬件之間有一個中間層,這就是與處理器相關的代碼,處理器不同,這部分代碼也不同,我們在移植時需要自己處理這部分代碼,在μc/os中這一部分代碼分成3個文件:os_cpu.h,os_cpu_a.asm,os_cpu_c.c。

          3.2.1 os_cpu.h

          包含了用#define定義的與處理器相關的常量、宏和類型定義,具體有系統數據類型定義、棧增長方向定義、關中斷和開中斷定義、系統軟中斷的定義等。

          (1)不依賴于編譯的數據類型

          μc/os-ⅱ不使用c語言中的short,int和long等數據類型的定義,因為他們與處理器類型有關,隱含著不可移植性,代之以移植性強的整數數據類型,這樣,既直觀又可移植。根據ads編譯器的特性,代碼為:

          typedef unsigned char boolean;

          typedef unsigned char int8u;

          typedef signed char int8s;

          typedef unsigned short int16u;

          typedef signed short int16s;

          typedef unsigned int int32u;

          typedef signed int int32s;

          typedef float fp32;

          typedef double fp64;

          typedef int32u os_stk;

          (2)使用軟中斷swi做底層接口

          因為帶t變量的arm7處理器核具有兩個指令集,用戶任務可以使用兩種處理器模式,為了使底層接口函數與處理器狀態無關,同時在任務調用相應函數時不需要知道該函數位置,本例使用軟中斷指令swi作為底層接口,使用不同的功能號區分不同的函數,其swi服務函數代碼為:


          (3)os_stk_growth

          μc/os-ⅱ使用結構常量os_stk_growth指定堆棧的生長方式,其代碼為:

          #define os_stk_growth 1

          3.2.2 os_cpu_c.c

          包含了與移植有關的c函數,包括堆棧的初始化和一些鉤子函數的實現,但是最重要的是ostaskstkinit()函數,該函數是在用戶建立任務時系統內部自己調用的,用來對用戶任務的堆棧初始化。在arm7體系結構下,任務堆棧空間由高至低遞減,依次保存著pc,lr,r12,…,r1,r0,cpsr的初始化堆棧結構,當用戶初始化了堆棧,ostaskstkinit()就返回新的堆棧指針stk所指的定地址。ostaskcreate()和ostaskcreateext()會獲得該地址并將他保存到任務控制塊tcb中,其他的幾個鉤子函數必須聲明,但可以不包含任務代碼,這些鉤子函數在本移植中全為空函數。

          3.2.3 os_cpu_a.s

          μc/os-ⅱ移植的絕大部分工作都集中在os_cpu_a.s文件的移植上,在這個文件里,最困難的工作又集中體現在osintctxsw和ostickisr這兩個函數的實現上。這是因為這兩個函數的實現是和移植者的移植思路以及相關硬件定時器、中斷寄存器的設置有關,在實際的移植工作中,這兩個地方也是比較容易出錯的地方,這部分需要對處理器的寄存器進行操作,所以必須用匯編語言編寫,包括4個子函數:osstarthighrdy()、osctxsw()、osintctxsw()、ostickisr()。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 兴义市| 龙陵县| 即墨市| 大余县| 巨鹿县| 香河县| 铅山县| 松潘县| 彭阳县| 宜宾县| 桃江县| 乌海市| 朝阳区| 昭平县| 九台市| 会东县| 辉南县| 雷山县| 巴林右旗| 红河县| 平遥县| 博白县| 凤翔县| 临西县| 宜州市| 昆明市| 松桃| 吐鲁番市| 柘荣县| 临泉县| 安阳县| 南乐县| 濮阳县| 兰考县| 咸阳市| 建湖县| 汕尾市| 九龙坡区| 鲁甸县| 内乡县| 邵武市|