国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于 S3C44B0X處理器的μC/OS-Ⅱ的移植方法研究

2011-11-06 05:36:54李興霞
大慶師范學(xué)院學(xué)報 2011年3期
關(guān)鍵詞:堆棧指針調(diào)用

李興霞

(佳木斯大學(xué)應(yīng)用技術(shù)學(xué)院,黑龍江佳木斯 154007)

基于 S3C44B0X處理器的μC/OS-Ⅱ的移植方法研究

李興霞

(佳木斯大學(xué)應(yīng)用技術(shù)學(xué)院,黑龍江佳木斯 154007)

主要研究了嵌入式操作系統(tǒng)μC/OS-Ⅱ在 ARM7上的移植方法。首先,分析了μC/OS-Ⅱ的軟硬件體系結(jié)構(gòu)。然后,在基于 ARM7架構(gòu)的 Samsung S3C44B0X硬件平臺上,成功地將μC/OS-Ⅱ移植到 S3C44B0X處理器上。詳細說明了μC/OS-Ⅱ的移植過程,給出了移植的具體方法和步驟。設(shè)計的移植方法不但使系統(tǒng)速度快、性能穩(wěn)定,而且操作簡單,具有很高的實用價值。

計算機軟件;移植;實驗;μC/OS-Ⅱ;嵌入式操作系統(tǒng);S3C44BOX

0 引言

所謂移植,就是使一個實時內(nèi)核能在特定的微處理器或微控制器上運行。μC/OS-Ⅱ是由美國人JeanJ.Labrosse編寫的,是一個完全免費的公開源代碼的實時操作系統(tǒng)。μC/OS-Ⅱ作為一個被廣泛應(yīng)用的操作系統(tǒng),在設(shè)計時就已經(jīng)充分考慮到了可移植性,其技術(shù)已經(jīng)很成熟[1]。本文分析了μC/OS-Ⅱ的結(jié)構(gòu),在以 S3C44BOX為核心的硬件平臺上移植實時操作系統(tǒng),給出移植要點及核心代碼實現(xiàn),對其它嵌入式操作系統(tǒng)的移植也有一定的參考價值。

1 μC/OS-II的源程序文件結(jié)構(gòu)

圖 1是μC/OS-Ⅱ的軟硬件體系結(jié)構(gòu)。與硬件相關(guān)的代碼處于程序的最底層,在其上是操作系統(tǒng)的相關(guān)代碼。與硬件無關(guān)的代碼,如應(yīng)用程序處于整個系統(tǒng)的頂層。這樣的結(jié)構(gòu)方便了μC/OS-Ⅱ操作系統(tǒng)的移植[2],在移植中,主要是對三個與硬件密切相關(guān)的文件進行修改和配置[3]。

圖1 μC/OS-Ⅱ的軟硬件體系結(jié)構(gòu)

2 μC/OS-II的移植

2.1 移植工作包括的內(nèi)容

1)用#define設(shè)置一個常量的值 (OS_CPU.H文件中);2)聲明 10個數(shù)據(jù)類型 (OS_CPU.H文件中);3)用#define聲明 3個宏 (OS_CPU.H文件中);

4)用 C語言編寫 6個簡單的函數(shù) (OS_CPU_C.C文件中);5)編寫 4個匯編語言函數(shù) (OS_CPU_A.AS M文件中)。

2.2 移植過程

接下來對移植過程中需要修改的文件做一些具體說明。

2.2.1 修改后的 OS_CPU.H

1)數(shù)據(jù)類型的定義

typedef unsigned charBOOLEAN;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 unsigned intOS_STK;

typedef unsigned intOS_CPU_SR;

2)常量的值設(shè)定

#define OS_CR ITI CAL_METHOD 2

3)宏的聲明

#define OS_ENTER_CR ITI CAL()ARMDisableInt()#define OS_EXIT_CR ITI CAL()ARMEnableInt()#define OS_TASK_S W OSCtxS w

2.2.2 關(guān)于 OS_CPU_A.AS M

在OS_CPU_A.AS M文件中,要求編寫以下四個簡單的匯編語言函數(shù):

①OSStartHighRdy();②OSCtxSw();③OSIntCtxSw();④OSTickISR()。

下面依次進行介紹,OSStartHighRdy()是系統(tǒng)剛剛創(chuàng)建完最初的若干任務(wù)后,有一個 OSStart()就開始運行,OSStart()找到最優(yōu)先的任務(wù),然后就調(diào)用 OSStartHighRdy()來啟動那個任務(wù)。在 OSStartHigh-Rdy()被調(diào)用之前,優(yōu)先級最高的任務(wù)的 TCB(很重要的概念)的指針 (同時也是剛才放好的堆棧指針)已經(jīng)被 OSStart()放在全局變量 OSTCBHighRdy中。OSStartHighRdy()的任務(wù)歸結(jié)如下:

1)啟動了之后,先調(diào)用一個任務(wù)允許用戶定 HOOK函數(shù);

2)全局變量 OSRuning設(shè)置為 TRUE,標志多任務(wù)系統(tǒng)開始運行;

3)SHighRdy指向的 TCB中得到堆棧指針,放在 R13里;

4)堆棧中恢復(fù)所有其他的相關(guān)寄存器,包括 CPSR,R0~R12,LR,PC。

這樣,任務(wù)函數(shù)就象被 BL指令調(diào)用了一樣,從 Task的第一條指令開始執(zhí)行了。除了這個最初的調(diào)度之外,系統(tǒng)里還會發(fā)生其他兩種情況的調(diào)度:一個任務(wù)調(diào)用 OsxxxPend()、OST imDelay()之類的函數(shù),主動放棄 CPU的使用權(quán);一個任務(wù)正在執(zhí)行,不愿意中止卻被中斷了,這個中斷源恰恰是 OST imTick類,要引起系統(tǒng)重新調(diào)度,這時發(fā)生的是搶占式調(diào)度,搶占式調(diào)度是實時系統(tǒng)實現(xiàn)的法寶,也是μC/OS-II的特色[4]。對于前者,它所調(diào)用的放棄 CPU的函數(shù)最后會調(diào)用一個 OS自己使用的函數(shù) OS_Sched(),這個函數(shù)找到下一個可以立即執(zhí)行的最高優(yōu)先級任務(wù),把他的 TCB指針放在全局變量 OSTCBHighRdy里,然后調(diào)用一個宏 OS_TASK_S W(),這個宏實際上被定義為 os_CPU_a.s中的函數(shù) OSCtxSw()。OSCtxSw()的任務(wù):保存當前任務(wù)上下文,裝入新任務(wù)上下文。偽代碼如下:

void OSCtxS w(void)

{

保存處理器寄存器;

將當前任務(wù)的堆棧指針保存到當前任務(wù)的 OS_TCB中:

OSTCBCur->OSTCBStkPtr=Stack pointer;

調(diào)用用戶定義的 OSTaskSwHook();

OSTCBCur=OSTCBHighRdy;

OSPrioCur=OSPrioHighRdy;

得到需要恢復(fù)的任務(wù)的堆棧指針;

Stack pointer=OSTCBHighRdy->OSTCBStkPtr;

將所有處理器寄存器從新任務(wù)的堆棧中恢復(fù)出來;

執(zhí)行中斷返回指令;

}

OSIntCtxSw()就是剛才提到的第二種情況,在中斷中發(fā)生調(diào)度時用到。如果一個中斷需要從中斷服務(wù)程序中進行調(diào)度,μC/OS-II的文檔給出了這種調(diào)度的處理方法:一旦有這種中斷發(fā)生,就保存正在運行任務(wù)的上下文,然后處理中斷,之后調(diào)用一個操作系統(tǒng)提供的在 ISR中使用的Mutex、Mai lBox之類的服務(wù)函數(shù),在這些函數(shù)的最后都會調(diào)用OSIntExit(),在這里發(fā)生了調(diào)度,OSIntExit()找出可以運行的最高優(yōu)先級任務(wù),把他的 TCB指針放在 OSTCBHighRdy里,最后如果需要調(diào)度,OSIntCtxSw()被調(diào)用。ARM硬件的中斷時續(xù)并不自動壓棧任何寄存器,所以免去了恢復(fù)堆棧指針的麻煩[5];另外,在進入 ISR保存當前任務(wù)現(xiàn)場時一同保存好 TCB中的堆棧指針,而不是在 OSIntCtxSw()中保存。下面是這個函數(shù)的偽代碼:

void OSIntCtxSw(void)

{

調(diào)整堆棧指針去掉在調(diào)用;

OSIntExit();

OSIntCtxSw()過程中壓入堆棧的多余內(nèi)容;

將當前任務(wù)堆棧指針保存到當前任務(wù)的 OS_TCB中:

OSTCBCur->OSTCBStkPtr=堆棧指針;

調(diào)用用戶定義的 OSTaskSwHook();

OSTCBCur=OSTCBHighRdy;

OSPrioCur=OSPrioHighRdy;

得到需要恢復(fù)的任務(wù)的堆棧指針:

堆棧指針 =OSTCBHighRdy->OSTCBStkPtr;

將所有處理器寄存器從新任務(wù)的堆棧中恢復(fù)出來;

執(zhí)行中斷返回指令;

}

OSTickISR()是μCOS-II搶占式調(diào)度 ISR的一個標本。當一個優(yōu)先級高的任務(wù)放棄 CPU使用權(quán),例如要休眠 10個 Tick,系統(tǒng)調(diào)度一個低優(yōu)先級的任務(wù)執(zhí)行之。OSTickISR()為休眠的任務(wù)計時,每次執(zhí)行,就把休眠任務(wù)剩余的睡覺時間減去一個 Tick數(shù)。如果發(fā)現(xiàn)一個任務(wù)睡夠了,就順便恢復(fù)它為 READY態(tài)。OSIntExit()從所有已經(jīng) READY的任務(wù)中,選擇一個優(yōu)先級最高的,恢復(fù)現(xiàn)場并往下執(zhí)行。所以可以相信,10個 Tick之后,恢復(fù)到那個高優(yōu)先級的任務(wù)現(xiàn)場,然后執(zhí)行它。偽代碼為:

void OSTickISR(void)

{

保存處理器寄存器;

調(diào)用 OSIntEnter()或者直接將 OSIn tNesting加 1;調(diào)用OST imeTick();調(diào)用OSIntExit();恢復(fù)處理器寄存器;執(zhí)行中斷返回指令;

}

2.2.3 關(guān)于 OS_CPU_C.C

μC/OS-II的移植要求編寫 6個簡單的 C語言函數(shù)。唯一必要的函數(shù)是 OSTaskStkInit(),其他五個函數(shù)必須得聲明但沒有必要包含代碼。

OSTaskCreate()和 OSTaskCreateExt()是通過調(diào)用 OSTaskStkInit()來初始化堆棧的,因此,此時的堆??雌饋砭屯瑒偘l(fā)生過中斷、并將所有的寄存器保存到堆棧中的情況一樣。

每個任務(wù)都是一個函數(shù),執(zhí)行這個任務(wù)就是調(diào)用這個函數(shù)。我們設(shè)想,這個任務(wù)的函數(shù)是 void Task1(void*pdata),執(zhí)行這個任務(wù)就是用 BL指令來調(diào)用函數(shù),執(zhí)行完 BL指令,中斷發(fā)生了,源代碼文件為 os_CPU_c.c,其中的 OSTaskStkInit()就改寫成:

/*注意上面一行,task1的第一個參數(shù)放這里,這是符合 ARM調(diào)用規(guī)范的,就是說,規(guī)范要求匯編程序在 BL指令之前,傳遞給函數(shù)的第一個參數(shù)要放在 R0里。記住我們的堆棧是剛剛執(zhí)行完 BLTASKn之后的狀態(tài)*/

經(jīng)過上述這些移植工作,μC/OS-II就可以在 S3C44BOX上開始工作了。

3 結(jié)束語

嵌入式操作系統(tǒng)的移植是一件很繁瑣的工作,開發(fā)人員要耗費很多時間和精力。本文實現(xiàn)了在S3C44BOX平臺上對μC/OS-II的移植,對移植過程進行了深入的研究,研究成果具有一定的實用價值,對其它嵌入式操作系統(tǒng)的移植也有一定的參考作用。

[1]拉伯羅斯.嵌入式實時操作系統(tǒng)μC/OS-Ⅱ[M].2版,邵貝貝,譯.北京:北京航空航天大學(xué)出版社,2005:27-34.[2]任哲.嵌入式實時操作系統(tǒng)μC/OS-II原理及應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2005:13-24.

[3]黃燕平.uC/OSARM移植要點詳解[M].北京:北京航空航天大學(xué)出版社,2005:391-396.

[4]周立功.ARM嵌入式系統(tǒng)基礎(chǔ)教程[M].北京:北京航空航天大學(xué)出版社,2005:365-368.

[5]田澤.嵌入式系統(tǒng)開發(fā)與應(yīng)用實驗教程[M].北京:北京航空航天大學(xué)出版社,2004:86-89.

Study forμC/OS-Ⅱ TransplantMethod Based on S3C44B0X Processor

L IXing-xia
(Institute of Technology,JiamusiUniversity,Jiamusi 154007,China)

This article hasmainly studied the embedded operating systemμC/OS-ⅡOnARM7 transplantmethod.First,has analyzedμC/OS-ⅡSoftware and hardware architecture.Then,in based on ARM7 construction Samsung in S3C44B0X hardware platfor m,successfullyμC/OS-Ⅱtransplants to the S3C44B0X processor.In the article explained in detailμC/OS- Ⅱtransplant process,has given the transplant concrete method and the step.This article designs not only the transplant method causes the system speed to be quick,stable property,moreover the simplicity of operator,has the very high use value.

computer software;transplant;experiment;μC/OS- Ⅱ;embedded operating system;S3C44BOX

TP316.2

A

2095-0063(2011)03-0028-04

2010-11-25

李興霞 (1972-),女,黑龍江寶清人,佳木斯大學(xué)應(yīng)用技術(shù)學(xué)院講師,從事嵌入式系統(tǒng)研究。

佳木斯大學(xué)科學(xué)技術(shù)研究項目 (L2009-159)。

猜你喜歡
堆棧指針調(diào)用
核電項目物項調(diào)用管理的應(yīng)用研究
偷指針的人
娃娃畫報(2019年5期)2019-06-17 16:58:10
LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
嵌入式軟件堆棧溢出的動態(tài)檢測方案設(shè)計*
為什么表的指針都按照順時針方向轉(zhuǎn)動
基于堆棧自編碼降維的武器裝備體系效能預(yù)測
基于系統(tǒng)調(diào)用的惡意軟件檢測技術(shù)研究
基于改進Hough變換和BP網(wǎng)絡(luò)的指針儀表識別
電測與儀表(2015年5期)2015-04-09 11:30:42
ARM Cortex—MO/MO+單片機的指針變量替換方法
利用RFC技術(shù)實現(xiàn)SAP系統(tǒng)接口通信
永仁县| 大悟县| 德阳市| 隆安县| 尉氏县| 乌海市| 屏山县| 绍兴县| 靖边县| 肃宁县| 灵川县| 万全县| 富阳市| 团风县| 同德县| 阳原县| 承德县| 土默特右旗| 吴川市| 凭祥市| 隆昌县| 双桥区| 盐亭县| 东阿县| 资溪县| 临汾市| 富源县| 松滋市| 中阳县| 乃东县| 金湖县| 水富县| 绥棱县| 会理县| 景东| 弋阳县| 汤阴县| 荔波县| 延长县| 洛浦县| 镇康县|