新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于μC/OS-Ⅱ在ARM7上移植方法的探討與實(shí)現(xiàn)

        基于μC/OS-Ⅱ在ARM7上移植方法的探討與實(shí)現(xiàn)

        作者: 時(shí)間:2012-11-30 來源:網(wǎng)絡(luò) 收藏

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

          3.2 與處理器相關(guān)的代碼

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

          3.2.1 os_cpu.h

          包含了用#define定義的與處理器相關(guān)的常量、宏和類型定義,具體有系統(tǒng)數(shù)據(jù)類型定義、棧增長方向定義、關(guān)中斷和開中斷定義、系統(tǒng)軟中斷的定義等。

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

          μc/os-ⅱ不使用c語言中的short,int和long等數(shù)據(jù)類型的定義,因?yàn)樗麄兣c處理器類型有關(guān),隱含著不可移植性,代之以移植性強(qiáng)的整數(shù)數(shù)據(jù)類型,這樣,既直觀又可移植。根據(jù)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做底層接口

          因?yàn)閹變量的arm7處理器核具有兩個指令集,用戶任務(wù)可以使用兩種處理器模式,為了使底層接口函數(shù)與處理器狀態(tài)無關(guān),同時(shí)在任務(wù)調(diào)用相應(yīng)函數(shù)時(shí)不需要知道該函數(shù)位置,本例使用軟中斷指令swi作為底層接口,使用不同的功能號區(qū)分不同的函數(shù),其swi服務(wù)函數(shù)代碼為:


          (3)os_stk_growth

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

          #define os_stk_growth 1

          3.2.2 os_cpu_c.c

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

          3.2.3 os_cpu_a.s

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



        關(guān)鍵詞: μCOS-Ⅱ ARM7 移植方法

        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 兰坪| 年辖:市辖区| 武平县| 顺义区| 定结县| 晋江市| 太原市| 淮阳县| 南投县| 司法| 常州市| 连平县| 中宁县| 嘉义县| 佛教| 广河县| 昌吉市| 富顺县| 张家界市| 广元市| 兴文县| 滁州市| 龙江县| 普兰店市| 台安县| 边坝县| 利辛县| 西吉县| 黎川县| 吉木乃县| 光泽县| 中宁县| 喀喇沁旗| 定日县| 灯塔市| 进贤县| 渑池县| 东安县| 天门市| 镇康县| 甘孜县|