當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]操作系統(tǒng)是用來管理系統(tǒng)硬件、軟件及數(shù)據(jù)資源,控制程序運(yùn)行,并為其它應(yīng)用軟件提供支持的一種系統(tǒng)軟件。根據(jù)不同的種類,又可分為實(shí)時(shí)操作系統(tǒng)、桌面操作系統(tǒng)、服務(wù)器操作系統(tǒng)等。對于一些小型的應(yīng)用,對系統(tǒng)實(shí)時(shí)性

操作系統(tǒng)是用來管理系統(tǒng)硬件、軟件及數(shù)據(jù)資源,控制程序運(yùn)行,并為其它應(yīng)用軟件提供支持的一種系統(tǒng)軟件。根據(jù)不同的種類,又可分為實(shí)時(shí)操作系統(tǒng)、桌面操作系統(tǒng)、服務(wù)器操作系統(tǒng)等。對于一些小型的應(yīng)用,對系統(tǒng)實(shí)時(shí)性要求高,硬件資源有限等的情況下,應(yīng)盡量避免使用復(fù)雜龐大的操作系統(tǒng)(如Linux),使用小型的實(shí)時(shí)操作系統(tǒng)(如uCOS)更能滿足應(yīng)用的需求。筆者此處就uCOS-II的移植作一個(gè)簡單的介紹。

1. 代碼準(zhǔn)備

uCOS-II V2.91源碼,這個(gè)版本的源碼是uCOS-II的最新版本,請讀者自行從Micrium官網(wǎng)或其它網(wǎng)站下載這個(gè)版本的源碼,當(dāng)然,其它版本的uCOS-II也是一樣方式移植的。Micrium官網(wǎng)也給出了一些cpu的移植范例,可供參考,此處是下載源碼,一步一步進(jìn)行移植。

s3c2416啟動代碼工程,啟動代碼是s3c2416/50/51這系列arm9芯片在運(yùn)行用戶c代碼main函數(shù)之前必須先運(yùn)行的代碼,啟動代碼支持sd、Nand啟動,為用戶設(shè)置系統(tǒng)時(shí)鐘,初始化內(nèi)存,自動識別啟動設(shè)備并搬移代碼到RAM,MMU映射,中斷管理等,用戶只需專注于用c開發(fā)其它功能函數(shù)即可。關(guān)于啟動代碼以及啟動代碼的實(shí)現(xiàn)過程,筆者前面章節(jié)有非常詳細(xì)的介紹。此處以GCC下移植uCOS為講解,下載”GCC啟動代碼工程應(yīng)用實(shí)例”中的啟動代碼源碼即可。如果在MDK下開發(fā),下載”MDK啟動代碼工程應(yīng)用實(shí)例”中的啟動代碼源碼。

用戶代碼,用c開發(fā)的所有功能代碼,其中,用戶代碼入口為main()函數(shù),在這里實(shí)現(xiàn)uCOS多任何運(yùn)行代碼。

2. 工程搭建

在linux操作系統(tǒng)下任一路徑下新建一個(gè)uCOS的工程目錄,該目錄下新建uCOS-II目錄用來保存uCOS相關(guān)部分。下載uCOS-II V2.91源碼并解壓,把Source目錄全部拷貝到uCOS-II目錄下,同時(shí)在目錄下新建一個(gè)Cfg目錄用來保存uCOS的配置文件,新建一個(gè)Ports目錄用來保存uCOS移植接口文件。

把啟用代碼目錄start_code拷貝到UCGUI目錄下,這部分代碼無需任何的修改。并保留其中的Makefile這些文件。GCC啟動代碼下的工程管理Makefile提取自uboot,可以方便地增加源代碼以及代碼目錄。

在UCGUI目錄下新建apps目錄,用來保存應(yīng)用相關(guān)的源碼。

最終的UCGUI目錄內(nèi)容如下:

uCOS/start_code,保存s3c2416啟動代碼相關(guān)的部分

uCOS/app,保存工個(gè)工程的應(yīng)用部分

uCOS/uCOS-II/Cfg,保存uCOS的配置部分

uCOS/uCOS-II/Ports,保存uCOS移植部分

uCOS/uCOS-II/Source,保存uCOS的源碼,通??芍苯犹鎿Q更高版本的源碼

3. uCOS移植

uCOS-II應(yīng)用在不同的cpu,需要在uCOS-II/Ports目錄中實(shí)現(xiàn)os_cpu.h、os_cpu_a.s、os_cpu_c.c這三個(gè)文件的修改編寫。

3.1. os_cpu.h的編寫3.1.1. 外部聲明

uCOS-II用OS_CPU_GLOBALS和OS_CPU_EXT來聲明外部的變量、符號,這部分如下:

#ifdef OS_CPU_GLOBALS

#define OS_CPU_EXT

#else

#define OS_CPU_EXT extern

#endif

3.1.2. 數(shù)據(jù)類型定義

為了確保uC/OS-II的可移植性,在os_cpu.h中聲明了一系列的類型定義。這些類型不依賴于c數(shù)據(jù)類型如int、short、long等。數(shù)據(jù)類型定義如下:

typedef unsigned char BOOLEAN; /* 布爾變量*/

typedef unsigned charINT8U; /* 無符號8位整型變量*/

typedef signed char INT8S; /* 有符號8位整型變量*/

typedef unsigned shortINT16U; /* 無符號16位整型變量*/

typedef signed shortINT16S; /* 有符號16位整型變量*/

typedef unsigned int INT32U; /* 無符號32位整型變量*/

typedef signed int INT32S; /* 有符號32位整型變量*/

typedef float FP32; /* 單精度浮點(diǎn)數(shù)(32位長度)*/

typedef double FP64; /* 雙精度浮點(diǎn)數(shù)(64位長度)*/

3.1.3. 棧配置

uCOS-II適用于8位、16位、32位的cpu,不同字長的cpu,其棧字長也是不一樣的,uCOS-II用OS_STK表?xiàng)n愋?,同時(shí)棧的生長方式可以由高地址到低地址,也可由低地址到高地址。對于arm架構(gòu)cpu,??梢韵蛳?,也可以向上增長。但對于各個(gè)編譯器是約定棧由高地址向低地址增長的,棧字長為32位。棧配置內(nèi)容如下:

typedef INT32U OS_STK; /* 棧是32位寬度*/

#define OS_STK_GROWTH 1 /* 棧是從高往下生長*/

3.1.4. 臨界區(qū)訪問

對于可搶占式操作系統(tǒng),有一小段關(guān)鍵代碼必須獨(dú)占訪問,如果有一個(gè)任務(wù)(線程)正在訪問臨界代碼,則其它任務(wù)(線程)不能再進(jìn)入該段代碼,直到占有訪問權(quán)的任務(wù)(線程)退出這個(gè)臨界區(qū)。uCOS-II在訪問內(nèi)核臨界區(qū)時(shí)是通過OS_ENTER_CRITICAL()/OS_EXIT_CRITICAL()這兩個(gè)宏開關(guān)中斷來禁止任務(wù)搶占來確保臨界區(qū)不被破壞。通常,臨界區(qū)訪問有三種方式,一是直接開關(guān)中斷,二是從棧中保存/恢復(fù)中斷狀態(tài)再開關(guān)中斷,三是從局部變量保存/恢復(fù)中斷狀態(tài)再開關(guān)中斷。uCOS-II采用了第三種開關(guān)中斷方式,需實(shí)現(xiàn)狀態(tài)保存恢復(fù)開關(guān)中斷CPU_SR_Save()/CPU_SR_Restore(),需引入一個(gè)OS_CPU_SR類型的變量保存cpu中斷狀態(tài),臨界區(qū)中斷訪問內(nèi)容如下:

#define OS_CRITICAL_METHOD 3 /*局部變量保存/恢復(fù)狀態(tài)再開關(guān)中斷 */

typedef INT32U OS_CPU_SR; /*開關(guān)中斷前用來保存/恢復(fù)中斷狀態(tài)*/

#define OS_ENTER_CRITICAL() {cpu_sr =CPU_SR_Save ();} /* 關(guān)中斷 */

#define OS_EXIT_CRITICAL() {CPU_SR_Restore (cpu_sr);} /* 開中斷*/

3.1.5. 函數(shù)聲明

uCOS-II需匯編實(shí)現(xiàn)開關(guān)中斷、任務(wù)切換這些與體系結(jié)構(gòu)相關(guān)的功能,在匯編文件os_cpu_a.s中進(jìn)行實(shí)現(xiàn),頭文件進(jìn)行函數(shù)聲明,聲明有如下幾個(gè)函數(shù):

#define OS_TASK_SW() OSCtxSw() /* 任務(wù)級任務(wù)切換函數(shù)*/

OS_CPU_SR CPU_SR_Save(void);

void CPU_SR_Restore(OS_CPU_SR cpu_sr);

void OSStartHighRdy(void);

void OSCtxSw(void);

void OSIntCtxSw(void);

3.2. os_cpu_a.s的編寫

高級語言不能實(shí)現(xiàn)保存/恢復(fù)寄存器,因此uCOS-II需要編寫匯編實(shí)現(xiàn)六個(gè)簡單的函數(shù),CPU_SR_Save ()、CPU_SR_Restore()、OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、IRQ_SaveContext()。

3.2.1. CPU_SR_Save()函數(shù)

由于采用從局部變量保存/恢復(fù)中斷狀態(tài)再開關(guān)中斷的方式,用R0返回中斷狀態(tài),并關(guān)閉中斷,該函數(shù)是OS_ENTER_CRITICAL()的宏實(shí)現(xiàn)。

.globl CPU_SR_Save

CPU_SR_Save:

MRS R0, CPSR

ORR R1, R0, #0xC0 // 設(shè)置IRQ,FIQ均禁止中斷

MSR CPSR_c, R1

BX LR // 禁止中斷,返回中斷狀態(tài)到R0中

3.2.2. CPU_SR_Restore()函數(shù)

臨界區(qū)訪問完后,需恢復(fù)關(guān)中斷前的中斷狀態(tài),該函數(shù)是OS_EXIT_CRITICAL()的宏實(shí)現(xiàn)。

.globl CPU_SR_Restore

CPU_SR_Restore:

MSR CPSR_c, R0

BX LR

3.2.3. OSStartHighRdy()函數(shù)

當(dāng)用戶通過OSStart()啟動uCOS內(nèi)核進(jìn)行管理時(shí),OSStart()會首先調(diào)用OSStartHighRdy()來運(yùn)行已創(chuàng)建任務(wù)中優(yōu)先級最高的任務(wù),OSStartHighRdy()需完成以下工作:

(1) 禁止中斷切換到管理模式,所有任務(wù)均工作在管理模式

(2) 調(diào)用任務(wù)切換鉤子函數(shù),即先調(diào)用OSTaskSwHook()函數(shù)

(3) 標(biāo)記uCOS-II內(nèi)核已啟動運(yùn)行,OSRunning = 1

(4) 獲得最高優(yōu)先級任務(wù)TCB,得到任務(wù)棧指針,SP切換到任務(wù)棧

(5) 出棧SP中的任務(wù)棧,包括任務(wù)狀態(tài)寄存器CPSR,R0-R12,LR,繼續(xù)執(zhí)行任務(wù)。

#define I_Bit 0x80// IRQ中斷禁止位

#define F_Bit 0x40// FIQ中斷禁止位

#define Mode_SVC 0x13 // 管理模式

#define Mode_SYS 0x1f // 系統(tǒng)模式

.extern OSTaskSwHook

.extern OSRunning

.extern OSTCBHighRdy

.globl OSStartHighRdy

OSStartHighRdy:

MSR CPSR_c, #(I_Bit+F_Bit+Mode_SVC) // 禁止中斷切換到管理模式

LDR R0, =OSTaskSwHook // 調(diào)用任務(wù)切換鉤子函數(shù)

MOV LR, PC // 準(zhǔn)備函數(shù)返回地址

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉