(ppt)嵌入式系統(tǒng)RTEOSμCII的移植_第1頁(yè)
(ppt)嵌入式系統(tǒng)RTEOSμCII的移植_第2頁(yè)
(ppt)嵌入式系統(tǒng)RTEOSμCII的移植_第3頁(yè)
(ppt)嵌入式系統(tǒng)RTEOSμCII的移植_第4頁(yè)
(ppt)嵌入式系統(tǒng)RTEOSμCII的移植_第5頁(yè)
已閱讀5頁(yè),還剩98頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、嵌入式系統(tǒng)嵌入式系統(tǒng) rteos c/os-ii 的移植主要內(nèi)容n移植規(guī)劃移植規(guī)劃nc/os-ii的移植的移植n嵌入式系統(tǒng)的初始化嵌入式系統(tǒng)的初始化 移植規(guī)劃-概述 所謂“移植”,就是使一個(gè)實(shí)時(shí)內(nèi)核能在其它的微處理器或微控制器上運(yùn)行。 盡管大部分c/os-ii的代碼是用c語(yǔ)言編寫的,但是在編寫與處理器硬件相關(guān)的代碼時(shí)還是不得不使用匯編語(yǔ)言。 移植的主要工作就是編寫這些與處理器硬件相關(guān)的代碼。 操作系統(tǒng)的移植大體可以分為兩個(gè)層次:n跨體系結(jié)構(gòu)的移植n針對(duì)特定處理器的移植 移植規(guī)劃 在移植前針對(duì)所使用的微處理器進(jìn)行規(guī)劃,主要有以下幾個(gè)方面的考慮:n 編譯器的選擇n 任務(wù)模式的選擇n 支持的指令集

2、移植規(guī)劃(續(xù))編譯器的選擇n針對(duì)arm處理器核的c語(yǔ)言編譯器有很多,如sdt、 ads、iar、tasking和gcc等n目前在國(guó)內(nèi)最流行的是ads、sdt和gccnsdt和ads均為arm公司自己開(kāi)發(fā),ads為sdt的升級(jí)版,以后arm公司不再支持sdt,故不選擇sdt。gcc雖然支持廣泛,很多開(kāi)發(fā)套件使用它作為編譯器,但是與ads比較其編譯效率較低,這對(duì)充分發(fā)揮芯片性能不利n考慮使用ads編譯程序和調(diào)試armarm的工作模式的工作模式narmarm處理器有處理器有7 7種操作模式種操作模式: :n用戶模式用戶模式(usr)(usr)n - - 正常的程序執(zhí)行模式正常的程序執(zhí)行模式n快速中斷

3、模式快速中斷模式(fiq)(fiq) - - 支持高速數(shù)據(jù)傳輸或通道處理支持高速數(shù)據(jù)傳輸或通道處理n中斷模式中斷模式(irq)(irq) - - 用于通用中斷處理用于通用中斷處理n管理員模式管理員模式(svc)(svc) - - 操作系統(tǒng)的保護(hù)模式操作系統(tǒng)的保護(hù)模式. .n中止模式中止模式(abt)(abt) - - 支持虛擬內(nèi)存和支持虛擬內(nèi)存和/ /或內(nèi)存保護(hù)等異常或內(nèi)存保護(hù)等異常n系統(tǒng)模式系統(tǒng)模式(sys)(sys) - - 支持操作系統(tǒng)的特殊用戶模式支持操作系統(tǒng)的特殊用戶模式( (運(yùn)行操作系統(tǒng)任務(wù))運(yùn)行操作系統(tǒng)任務(wù))n未定義模式未定義模式(und)(und) - - 支持硬件協(xié)處理器的軟

4、件仿真支持硬件協(xié)處理器的軟件仿真 n除了用戶模式外,其他模式均可視為特權(quán)模式除了用戶模式外,其他模式均可視為特權(quán)模式 移植規(guī)劃(續(xù))n任務(wù)模式的取舍 arm7處理器核具有上述七種模式,其中除用戶模式外其它均為特權(quán)模式。其中管理、中止、未定義、中斷和快中斷模式與相應(yīng)異常相聯(lián)系,任務(wù)使用這些模式不太適合。 系統(tǒng)模式除了是特權(quán)模式外,其它與用戶模式一樣,因而可選為任務(wù)使用的模式只有用戶模式和系統(tǒng)模式。 為了盡量減少任務(wù)代碼錯(cuò)誤對(duì)整個(gè)程序的影響,缺省的任務(wù)模式定為用戶模式,可選為系統(tǒng)模式,同時(shí)提供接口使任務(wù)可以在這兩種模式間切換。移植規(guī)劃(續(xù))n支持的指令集帶t變量的arm7處理器核具有兩個(gè)指令集:n

5、標(biāo)準(zhǔn)32位arm指令集n16位thumb指令集 兩種指令集有不同的應(yīng)用范圍。n為了最大限度地支持芯片的特性,任務(wù)應(yīng)當(dāng)可以使用任意一個(gè)指令集并可以自由切換,而且不同的任務(wù)應(yīng)當(dāng)可以使用不同的指令集移植c/os-iin概述 要移植一個(gè)操作系統(tǒng)到一個(gè)特定的cpu體系結(jié)構(gòu)并不是一件很容易的事情,它對(duì)移植者有以下要求:1 對(duì)目標(biāo)體系結(jié)構(gòu)要有很深了解;2 對(duì)os原理要有較深入的了解;3 對(duì)所使用的編譯器要有較深入的了解;4 對(duì)需要移植的操作系統(tǒng)要有相當(dāng)?shù)牧私猓? 對(duì)具體使用的芯片也要一定的了解 要移植一個(gè)操作系統(tǒng)到一個(gè)特定的cpu體系結(jié)構(gòu)上并不是一件很容易的事情,它對(duì)移植者有以下要求:1 對(duì)目標(biāo)體系結(jié)構(gòu)要有

6、很深了解;2 對(duì)os原理要有較深入的了解;3 對(duì)所使用的編譯器要有較深入的了解;4 對(duì)需要移植的操作系統(tǒng)要有相當(dāng)?shù)牧私猓? 對(duì)具體使用的芯片也要一定的了解。 概述主要內(nèi)容主要內(nèi)容n移植規(guī)劃移植規(guī)劃nc/os-ii的移植的移植n嵌入式系統(tǒng)的初始化嵌入式系統(tǒng)的初始化 c/osc/os-ii-ii的文件結(jié)構(gòu)的文件結(jié)構(gòu) c/os-ii移植應(yīng)用程序(用戶代碼)c/os-ii(與處理器無(wú)關(guān)代碼)os_core.cos_flag.c. c/os-ii配置(與應(yīng)用相關(guān))os_cfg.hincludes.h c/os-ii移植(與處理器相關(guān)代碼)cpu定時(shí)器 硬件軟件c/os-ii硬件軟件體系結(jié)構(gòu)用于產(chǎn)生系統(tǒng)時(shí)

7、鐘移植時(shí)需要編寫的代碼移植移植 c/os-ii滿足的條件滿足的條件 n處理器的c編譯器能產(chǎn)生可重入代碼 n在程序中可以打開(kāi)或者關(guān)閉中斷 n處理器支持中斷,并且能產(chǎn)生定時(shí)中斷(通常在10100hz之間) n處理器支持能夠容納一定量數(shù)據(jù)的硬件堆棧(通常是幾千字節(jié)) n處理器有將堆棧指針和其他cpu寄存器的內(nèi)容存儲(chǔ)和讀出到堆棧(或者內(nèi)存)的指令 什么是可重入代碼什么是可重入代碼 n可重入的代碼指的是一段可以被多個(gè)任務(wù)同時(shí)調(diào)用,而不必?fù)?dān)心會(huì)破壞數(shù)據(jù)的代碼(比如:一個(gè)函數(shù))n即:可重入型函數(shù)在任何時(shí)候都可以被中斷執(zhí)行,過(guò)一段時(shí)間以后又可以繼續(xù)運(yùn)行,而不會(huì)因?yàn)樵诤瘮?shù)中斷的時(shí)候被其他的任務(wù)重新調(diào)用,而影響函

8、數(shù)中的數(shù)據(jù) 可重入代碼舉例可重入代碼舉例程序1:可重入型函數(shù)void swap(int *x, int *y)int temp;temp=*x;*x=*y;*y=temp;非可重入代碼舉例非可重入代碼舉例程序2:非可重入型函數(shù)int temp;void swap(int *x, int *y)temp=*x;*x=*y;*y=temp;不可重入函數(shù)被中斷破壞不可重入函數(shù)被中斷破壞如何使函數(shù)具有可重入性如何使函數(shù)具有可重入性 使swap()函數(shù)具有可重入性的條件:n把temp定義為局部變量n調(diào)用swap()函數(shù)之前關(guān)中斷,調(diào)用 后再開(kāi)中斷n用信號(hào)量禁止該函數(shù)在使用過(guò)程中 被再次調(diào)用 概述 根據(jù)c

9、/os-ii的要求,移植c/os-ii到一個(gè)新的體系結(jié)構(gòu)上需要提供2個(gè)或3個(gè)文件: os_cpu.h(c語(yǔ)言頭文件) os_cpu_c.c(c程序源文件) os_cpu_a.asm(匯編程序源文件) 其中os_cpu_a.asm在某些情況下不需要,但極其罕見(jiàn)。不需要os_cpu_a.asm的必須滿足以下苛刻條件: 1.可以直接使用c語(yǔ)言開(kāi)關(guān)中斷; 2.可以直接使用c語(yǔ)言編寫中斷服務(wù)程序; 3.可以直接使用c語(yǔ)言操作堆棧指針; 4.可以直接使用c語(yǔ)言保存cpu的所有寄存器。 移植需要編寫的文件 概述移植內(nèi)容類型所屬文件描述boolean、int8u、int8s、數(shù)據(jù)類型os_cpu.h與編譯器無(wú)

10、關(guān)的數(shù)據(jù)類型os_stk數(shù)據(jù)類型os_cpu.h堆棧的數(shù)據(jù)類型os_enter_critical()和os_exit_critical()宏os_cpu.h開(kāi)關(guān)中斷的代碼os_stk_growth常量os_cpu.h定義堆棧的增長(zhǎng)方向os_task_sw函數(shù)os_cpu.h任務(wù)切換時(shí)執(zhí)行的代碼ostaskstkinit()函數(shù)os_cpu_c.c任務(wù)堆棧初始化函數(shù)osinithookbegin()、osinithookend()、函數(shù)os_cpu_c.cc/os-ii在執(zhí)行某些操作時(shí)調(diào)用的用戶函數(shù),一般為空osstarthighrdy()函數(shù)*os_cpu_a.asm進(jìn)入多任務(wù)環(huán)境時(shí)運(yùn)行優(yōu)先級(jí)

11、最高的任務(wù), osintctxsw()函數(shù)*os_cpu_a.asm中斷退出時(shí)的任務(wù)切換函數(shù)ostickisr()中斷服務(wù)程序*os_cpu_a.asm時(shí)鐘節(jié)拍中斷服務(wù)程序 實(shí)際上,還有一個(gè)文件很重要,它就是irq.inc,它定義了一個(gè)匯編宏,它是c/os-ii for arm7通用的中斷服務(wù)程序的匯編與c函數(shù)接口代碼接口代碼。時(shí)鐘節(jié)拍中斷服務(wù)程序也沒(méi)有移植,因?yàn)槠渑c芯片和應(yīng)用都強(qiáng)烈相關(guān),需要用戶自己編寫,不過(guò)可以通過(guò)irq.inc簡(jiǎn)化用戶代碼的編寫。 移植代碼包括的主要內(nèi)容關(guān)于頭文件includes.h和config.hn c/os-ii要求所有.c文件的都要包含頭文件includes.h,

12、這樣使得用戶項(xiàng)目中的每個(gè).c文件不用分別去考慮它實(shí)際上需要哪些頭文件。n 使用includes.h的缺點(diǎn)是它可能會(huì)包含一些實(shí)際不相關(guān)的頭文件,這意味著每個(gè)文件的編譯時(shí)間可能會(huì)增加,但卻增強(qiáng)了代碼的可移植性。 在移植中另外增加了一個(gè)頭文件config.h,要求所有用戶程序必須包含config.h,在config.h中包含includes.h和特定的頭文件和配置項(xiàng)。而c/os-ii的系統(tǒng)文件依然只是包含includes.h,即c/os-ii的系統(tǒng)文件完全不必改動(dòng)。所有的配置改變包括頭文件的增減均在config.h中進(jìn)行,而includes.h定下來(lái)后不必改動(dòng)(c/os-ii的系統(tǒng)文件需要包含的東西

13、是固定的)。這樣,c/os-ii的系統(tǒng)文件需要編譯的次數(shù)大大減少,編譯時(shí)間隨之減少。 congfig.huc/os內(nèi)核文件includes.h用戶程序設(shè)置與處理器和編譯器相關(guān)的代碼設(shè)置與處理器和編譯器相關(guān)的代碼nos_cpu.h中定義了與編譯器相關(guān)的數(shù)據(jù)類型。比如:int8u、int8s等。n與 arm處理器相關(guān)的代碼,使用os_enter_critical() 和os_exit_critical() 宏開(kāi)啟關(guān)閉中斷n設(shè)置堆棧的增長(zhǎng)方向 :堆棧由高地址向低地址增長(zhǎng) 編寫os_cpu.h c/os-ii使用結(jié)構(gòu)常量os_stk_growth中指定堆棧的生長(zhǎng)方式:置os_stk_growth為0表

14、示堆棧從下往上長(zhǎng)。 置os_stk_growth為1表示堆棧從上(高地址)(高地址)往下(低地址)(低地址)長(zhǎng)。 雖然arm處理器核對(duì)于兩種方式均支持,但ads的c語(yǔ)言編譯器僅支持一種方式,即從上往下長(zhǎng),并且必須是滿遞減堆棧,所以os_stk_growth的值為1。#define os_stk_growth 1 堆棧生長(zhǎng)方式 編寫os_cpu.h c/os-ii不使用c語(yǔ)言中的short、int、long等數(shù)據(jù)類型的定義,因?yàn)樗鼈兣c處理器類型有關(guān),隱含著不可移植性與處理器類型有關(guān),隱含著不可移植性。代之以移植性強(qiáng)的整數(shù)數(shù)據(jù)類型,這樣,既直觀又可移植,不過(guò)這就成了必須移植的代碼。根據(jù)ads編譯器

15、的特性,這些代碼如下程序清單所示(與編譯有關(guān))。typedefunsigned char boolean; typedefunsigned char int8u;typedefsigned char int8s;typedefunsigned short int16u;typedefsigned short int16s;typedefunsigned int int32u;typedefsigned int int32s;typedeffloat fp32;typedefdouble fp64;typedefint32u os_stk;不依賴于編譯的數(shù)據(jù)類型設(shè)置設(shè)置includes.htyp

16、edef unsigned char boolean;typedef unsigned char int8u; typedef signed char int8s; typedef unsigned int int16u; typedef signed int int16s; typedef unsigned long int32u; typedef signed long int32s; typedef float fp32; typedef double fp64; typedef unsigned long os_stk; typedef unsigned long os_cpu_sr;

17、 extern int ints_off(void); extern void ints_on(void);#define os_enter_critical() cpu_sr = ints_off(); #define os_exit_critical() if(cpu_sr = 0) ints_on(); #define os_stk_growth 1 /*從高向低*/程序狀態(tài)寄存器程序狀態(tài)寄存器(cpsr)n 條件位條件位:nn = 1-結(jié)果為負(fù),0-結(jié)果為正或0nz = 1-結(jié)果為0,0-結(jié)果不為0nc =1-進(jìn)位,0-借位nv =1-結(jié)果溢出,0結(jié)果沒(méi)溢出nq q 位位:n僅arm

18、5te/j架構(gòu)支持n指示增強(qiáng)型dsp指令是否溢出nj j 位位n僅arm 5te/j架構(gòu)支持nj = 1: 處理器處于jazelle狀態(tài)n中斷禁止位中斷禁止位:ni = 1: 禁止 irq.nf = 1: 禁止 fiq.nt bitt bitn僅arm xt架構(gòu)支持nt = 0: 處理器處于 arm 狀態(tài)nt = 1: 處理器處于 thumb 狀態(tài)nmodemode位位( (處理器模式位處理器模式位):):n0b10000usern0b10001fiqn0b10010irqn0b10011supervisorn0b10111abortn0b11011undefinedn0b11111syste

19、m2731n z c v q2867i f t mode1623 815 54024fsxc u n d e f i n e dj 編寫os_cpu.h c/os-ii運(yùn)行時(shí),處理器可能處于的模式如下圖所示:使用軟中斷swi作底層接口thumb指令集arm指令集用戶模式系統(tǒng)模式用戶任務(wù)使用的處理器模式arm7內(nèi)核具有的指令集arm指令用戶模式arm指令系統(tǒng)模式thumb指令系統(tǒng)模式thumb指令用戶模式 編寫os_cpu.h 為了使底層接口函數(shù)與處理器狀態(tài)無(wú)關(guān),同時(shí)在任務(wù)調(diào)用相應(yīng)的函數(shù)不需要知道函數(shù)位置,在移植中使用軟中斷指令swi作為底層接口,使用不同的功能號(hào)區(qū)分不同的函數(shù)。軟中斷功能號(hào)分配

20、如下表所示,未列出的為保留功能。 使用軟中斷swi作底層接口功能號(hào)接口函數(shù)簡(jiǎn)介0 x00void os_task_sw(void)任務(wù)級(jí)任務(wù)切換函數(shù)0 x01_osstarthighrdy(void)運(yùn)行優(yōu)先級(jí)最高的任務(wù),由osstarthighrdy產(chǎn)生0 x02void os_enter_critical(void)關(guān)中斷0 x03void os_exit_critical(void)開(kāi)中斷0 x80void changetosysmode(void)任務(wù)切換到系統(tǒng)模式0 x81void changetousrmode(void)任務(wù)切換到用戶模式0 x82void taskisarm(i

21、nt8u prio)任務(wù)代碼是arm代碼0 x83void taskisthumb(int8u prio)任務(wù)代碼是thumb代碼 編寫os_cpu.h 用軟中斷作為操作系統(tǒng)的底層接口就需要在c語(yǔ)言中使用swi(software interrupt)指令。在ads中,有一個(gè)關(guān)鍵字_swi,用它聲明一個(gè)不存在的函數(shù),則調(diào)用這個(gè)函數(shù)就在調(diào)用這個(gè)函數(shù)的地方插入一條swi指令,并且可以指定功能號(hào)。同時(shí),這個(gè)函數(shù)也可以有參數(shù)和返回值,其傳遞規(guī)則與一般函數(shù)相同。 使用軟中斷swi作底層接口/* 任務(wù)級(jí)任務(wù)切換函數(shù) */_swi(0 x00) void os_task_sw(void); /* 運(yùn)行優(yōu)先級(jí)最

22、高的任務(wù) */_swi(0 x01) void _osstarthighrdy(void); /* 關(guān)中斷 */_swi(0 x02) void os_enter_critical(void); /* 開(kāi)中斷 */_swi(0 x03) void os_exit_critical(void); /* 任務(wù)切換到系統(tǒng)模式 */_swi(0 x80) void changetosysmode(void); /* 任務(wù)切換到用戶模式 */_swi(0 x81) void changetousrmode(void); /* 任務(wù)代碼是arm代碼 */_swi(0 x82) void taskisarm

23、(int8u prio);/* 任務(wù)代碼是thumb代碼 */_swi(0 x83) void taskisthumb(int8u prio);程序中調(diào)用軟中斷時(shí)使用的函數(shù)名軟件中斷號(hào)該調(diào)用不返回參數(shù)編寫os_cpu_c.cnc/os-iic/os-ii的移植要求用戶編寫的移植要求用戶編寫1010個(gè)個(gè)c c函數(shù):函數(shù):nostaskstkinitostaskstkinit():(): ostaskcreatostaskcreat()和()和ostaskcreatextostaskcreatext()通過(guò)調(diào)用()通過(guò)調(diào)用 本函數(shù),初始化任務(wù)的棧結(jié)構(gòu)本函數(shù),初始化任務(wù)的棧結(jié)構(gòu)nostaskcrea

24、tehookostaskcreatehook():每當(dāng)添加任務(wù)時(shí)由():每當(dāng)添加任務(wù)時(shí)由os_tcbinit( )os_tcbinit( )函數(shù)調(diào)用函數(shù)調(diào)用nostaskdelhookostaskdelhook():(): 任務(wù)被刪除后由任務(wù)被刪除后由ostaskdelostaskdel()調(diào)用()調(diào)用nostaskswhookostaskswhook():(): 任務(wù)切換時(shí)兩種情況均會(huì)調(diào)用該函數(shù)任務(wù)切換時(shí)兩種情況均會(huì)調(diào)用該函數(shù)nostaskidlehookostaskidlehook():():ostaskidleostaskidle()函數(shù)可調(diào)用該函數(shù)實(shí)現(xiàn)()函數(shù)可調(diào)用該函數(shù)實(shí)現(xiàn)cpucp

25、u低功耗模式低功耗模式nostimetickhookostimetickhook():本函數(shù)在每個(gè)時(shí)鐘節(jié)拍都會(huì)被():本函數(shù)在每個(gè)時(shí)鐘節(jié)拍都會(huì)被ostimetickostimetick()調(diào)用()調(diào)用nosinithookbeginosinithookbegin():進(jìn)入():進(jìn)入osinitosinit()函數(shù)后本函數(shù)會(huì)立即被調(diào)用()函數(shù)后本函數(shù)會(huì)立即被調(diào)用nosinithookendosinithookend():(): osinitosinit()函數(shù)返回之前被調(diào)用()函數(shù)返回之前被調(diào)用nostcbinithookostcbinithook():():os_tcbinit( )os_tc

26、binit( )在調(diào)用在調(diào)用ostaskcreatehookostaskcreatehook()之前將先()之前將先 調(diào)用本函數(shù)調(diào)用本函數(shù)n唯一必要的函數(shù)是唯一必要的函數(shù)是ostaskstkinitostaskstkinit(),其他(),其他9 9個(gè)函數(shù)必須聲明,但不一定個(gè)函數(shù)必須聲明,但不一定要包含任何代碼要包含任何代碼編寫os_cpu_c.c 該函數(shù)用于初始化任務(wù)堆棧,使任務(wù)的堆??雌饋?lái)就像剛發(fā)生中斷一樣。即任務(wù)被執(zhí)行時(shí),就像從中斷返回一樣。 在編寫此函數(shù)之前,必須先確定任務(wù)的堆棧結(jié)構(gòu)。而任務(wù)的堆棧結(jié)構(gòu)是與cpu的體系結(jié)構(gòu)、編譯器有密切的關(guān)聯(lián)。本移植的堆棧結(jié)構(gòu)如下圖所示。 ostasks

27、tkinit( )任務(wù)入棧的其它數(shù)據(jù)lrr12r11r10r9r8. 棧底 任務(wù)環(huán)境開(kāi)始 sppcr2r1r0osentersum空閑空間編寫os_cpu_c.costaskstkinit( )os_stk *ostaskstkinit (void (*task)(void *pd), void *pdata, os_stk *ptos, int16u opt) os_stk *stk; opt = opt; stk = ptos; *stk = (os_stk) task; *-stk = (os_stk) task; *-stk = 0; *-stk = 0; *-stk = 0; *-s

28、tk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = (unsigned int) pdata; *-stk = (user_using_mode|0 x00); *-stk = 0; return (stk); 入棧的數(shù)據(jù)任務(wù)入棧的其它數(shù)據(jù)lrr12r11r10r9r8. 棧底 任務(wù)環(huán)境開(kāi)始 sppcr2r1r0osentersum空閑空間編寫os_cpu_c.costaskstkinit( )os_stk *ostaskstkinit (

29、void (*task)(void *pd), void *pdata, os_stk *ptos, int16u opt) os_stk *stk; opt = opt; stk = ptos; *stk = (os_stk) task; *-stk = (os_stk) task; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = 0; *-stk = (unsigned int) p

30、data; *-stk = (user_using_mode|0 x00); *-stk = 0; return (stk); 該數(shù)據(jù)比較特別,它用于保存該任務(wù)關(guān)中斷的次數(shù),它在調(diào)用os_enter_critical( )時(shí)加1,在調(diào)用os_exit_critical( )時(shí)減1。 這樣每個(gè)任務(wù)都可以獨(dú)立控制本任務(wù)的中斷允許狀態(tài),而不會(huì)影響其它任務(wù)的中斷允許狀態(tài)。因此關(guān)中斷和開(kāi)中斷就可以嵌套。 編寫os_cpu_c.c軟件中斷異常服務(wù)程序 操作系統(tǒng)與硬件相關(guān)的底層函數(shù)使用軟件中斷作為接口,如下表所示。n 移植代碼中一個(gè)重要的工作就是為這些軟件中斷編寫服務(wù)程序功能號(hào)接口函數(shù)簡(jiǎn)介0 x00void

31、 os_task_sw(void)任務(wù)級(jí)任務(wù)切換函數(shù)0 x01_osstarthighrdy(void)運(yùn)行優(yōu)先級(jí)最高的任務(wù),由osstarthighrdy產(chǎn)生0 x02void os_enter_critical(void)關(guān)中斷0 x03void os_exit_critical(void)開(kāi)中斷0 x80void changetosysmode(void)任務(wù)切換到系統(tǒng)模式0 x81void changetousrmode(void)任務(wù)切換到用戶模式0 x82void taskisarm(int8u prio)任務(wù)代碼是arm代碼0 x83void taskisthumb(int8u

32、prio)任務(wù)代碼是thumb代碼編寫os_cpu_c.c軟件中斷異常服務(wù)程序功能號(hào)簡(jiǎn)介0 x00任務(wù)級(jí)任務(wù)切換函數(shù)0 x01運(yùn)行優(yōu)先級(jí)最高的任務(wù),由osstarthighrdy產(chǎn)生0 x02關(guān)中斷0 x03開(kāi)中斷0 x80任務(wù)切換到系統(tǒng)模式0 x81任務(wù)切換到用戶模式0 x82任務(wù)代碼是arm代碼0 x83任務(wù)代碼是thumb代碼功能號(hào)接口函數(shù)簡(jiǎn)介0 x00void os_task_sw(void)任務(wù)級(jí)任務(wù)切換函數(shù)0 x01_osstarthighrdy(void)運(yùn)行優(yōu)先級(jí)最高的任務(wù),由osstarthighrdy產(chǎn)生0 x02void os_enter_critical(void)關(guān)中

33、斷0 x03void os_exit_critical(void)開(kāi)中斷0 x80void changetosysmode(void)任務(wù)切換到系統(tǒng)模式0 x81void changetousrmode(void)任務(wù)切換到用戶模式0 x82void taskisarm(int8u prio)任務(wù)代碼是arm代碼0 x83void taskisthumb(int8u prio)任務(wù)代碼是thumb代碼void swi_exception(int swi_num, int *regs) os_tcb *ptcb; switch(swi_num) case 0 x02: / 關(guān)中斷 . case

34、0 x03: / 開(kāi)中斷 . case 0 x80: / 任務(wù)切換到系統(tǒng)模式 . case 0 x81: / 任務(wù)切換到用戶模式 . case 0 x82: / 任務(wù)代碼是arm代碼 . case 0 x83: / 任務(wù)代碼是thumb代碼 . default: 這兩個(gè)軟件中斷使用匯編代碼完成編寫os_cpu_c.c軟件中斷異常服務(wù)程序功能號(hào)簡(jiǎn)介0 x00任務(wù)級(jí)任務(wù)切換函數(shù)0 x01運(yùn)行優(yōu)先級(jí)最高的任務(wù),由osstarthighrdy產(chǎn)生0 x02關(guān)中斷0 x03開(kāi)中斷0 x80任務(wù)切換到系統(tǒng)模式0 x81任務(wù)切換到用戶模式0 x82任務(wù)代碼是arm代碼0 x83任務(wù)代碼是thumb代碼 c/

35、os-ii的啟動(dòng)多任務(wù)環(huán)境的函數(shù)叫做osstart(),用戶在調(diào)用osstart()之前,必須已經(jīng)建立了一個(gè)或更多任務(wù)。osstart()最終調(diào)用函數(shù)osstarthighrdy()運(yùn)行多任務(wù)啟動(dòng)前優(yōu)先級(jí)最高的任務(wù)。 void osstarthighrdy(void) _osstarthighrdy(); 該函數(shù)在os_cpu_a.s文件中實(shí)現(xiàn)。編寫os_cpu_c.c軟件中斷異常服務(wù)程序功能號(hào)簡(jiǎn)介0 x00任務(wù)級(jí)任務(wù)切換函數(shù)0 x01運(yùn)行優(yōu)先級(jí)最高的任務(wù),由osstarthighrdy產(chǎn)生0 x02關(guān)中斷0 x03開(kāi)中斷0 x80任務(wù)切換到系統(tǒng)模式0 x81任務(wù)切換到用戶模式0 x82任務(wù)代

36、碼是arm代碼0 x83任務(wù)代碼是thumb代碼 關(guān)中斷和開(kāi)中斷是為了保護(hù)臨界段代碼。這些代碼與處理器有關(guān),是需要移植的代碼。在arm處理器核中關(guān)中斷和開(kāi)中斷時(shí)通過(guò)改變程序狀態(tài)寄存器cpsr中的相應(yīng)控制位實(shí)現(xiàn)。由于使用了軟件中斷,程序狀態(tài)寄存器cpsr保存到程序狀態(tài)保存寄存器spsr中,軟件中斷退出時(shí)會(huì)將spsr恢復(fù)到cpsr中,所以程序只要改變程序狀態(tài)保存寄存器spsr中的相應(yīng)的控制位就可以了。 編寫os_cpu_c.c軟件中斷異常服務(wù)程序功能號(hào)簡(jiǎn)介0 x00任務(wù)級(jí)任務(wù)切換函數(shù)0 x01運(yùn)行優(yōu)先級(jí)最高的任務(wù),由osstarthighrdy產(chǎn)生0 x02關(guān)中斷0 x03開(kāi)中斷0 x80任務(wù)切換

37、到系統(tǒng)模式0 x81任務(wù)切換到用戶模式0 x82任務(wù)代碼是arm代碼0 x83任務(wù)代碼是thumb代碼void swi_exception(int swi_num, int *regs) . case 0 x02: / 關(guān)中斷 _asm mrs r0,spsr orr r0,r0,#noint msr spsr_c,r0 osentersum+; break; case 0 x03: / 開(kāi)中斷 if (-osentersum = 0) _asm mrs r0,spsr bic r0,r0,#noint msr spsr_c,r0 break; .每關(guān)閉一次中斷,中斷關(guān)閉計(jì)數(shù)器加1每調(diào)用一次開(kāi)

38、中斷函數(shù),該計(jì)數(shù)器減1,為0時(shí)允許打開(kāi)中斷關(guān)閉中斷打開(kāi)中斷編寫os_cpu_c.c軟件中斷異常服務(wù)程序功能號(hào)簡(jiǎn)介0 x00任務(wù)級(jí)任務(wù)切換函數(shù)0 x01運(yùn)行優(yōu)先級(jí)最高的任務(wù),由osstarthighrdy產(chǎn)生0 x02關(guān)中斷0 x03開(kāi)中斷0 x80任務(wù)切換到系統(tǒng)模式0 x81任務(wù)切換到用戶模式0 x82任務(wù)代碼是arm代碼0 x83任務(wù)代碼是thumb代碼 它們可以在任何情況下使用。它們改變程序狀態(tài)保留寄存器程序狀態(tài)保留寄存器spsrspsr的相應(yīng)位段,而程序狀態(tài)保留寄存器會(huì)在軟件中斷退出時(shí)復(fù)制到程序狀態(tài)寄存程序狀態(tài)寄存器器cpsrcpsr,任務(wù)的處理器模式就改變了。 編寫os_cpu_c.c

39、軟件中斷異常服務(wù)程序功能號(hào)簡(jiǎn)介0 x00任務(wù)級(jí)任務(wù)切換函數(shù)0 x01運(yùn)行優(yōu)先級(jí)最高的任務(wù),由osstarthighrdy產(chǎn)生0 x02關(guān)中斷0 x03開(kāi)中斷0 x80任務(wù)切換到系統(tǒng)模式0 x81任務(wù)切換到用戶模式0 x82任務(wù)代碼是arm代碼0 x83任務(wù)代碼是thumb代碼void swi_exception(int swi_num, int *regs) . case 0 x80: / 任務(wù)切換到系統(tǒng)模式 _asm mrs r0,spsr bic r0,r0,#0 x1f orr r0,r0,#sys32mode msr spsr_c,r0 break; case 0 x81: / 任務(wù)切

40、換到用戶模式 _asm mrs r0,spsr bic r0,r0,#0 x1f orr r0,r0,#usr32mode msr spsr_c,r0 break; .使用內(nèi)嵌匯編將處理器模式切換到用戶模式使用內(nèi)嵌匯編將處理器模式切換到系統(tǒng)模式編寫os_cpu_c.c軟件中斷異常服務(wù)程序功能號(hào)簡(jiǎn)介0 x00任務(wù)級(jí)任務(wù)切換函數(shù)0 x01運(yùn)行優(yōu)先級(jí)最高的任務(wù),由osstarthighrdy產(chǎn)生0 x02關(guān)中斷0 x03開(kāi)中斷0 x80任務(wù)切換到系統(tǒng)模式0 x81任務(wù)切換到用戶模式0 x82任務(wù)代碼是arm代碼0 x83任務(wù)代碼是thumb代碼 任務(wù)可以使用arm的兩種指令集的任意一種運(yùn)行,但是任務(wù)

41、建立時(shí)默認(rèn)的只是一種指令集。如果任務(wù)使用的第一條指令與默認(rèn)的指令集不同,則程序運(yùn)行錯(cuò)誤。所以增加兩個(gè)函數(shù)taskisarm()和taskisthumb()用于改變?nèi)蝿?wù)建立時(shí)用于改變?nèi)蝿?wù)建立時(shí)默認(rèn)的指令集。默認(rèn)的指令集。 它們都有唯一的參數(shù):需要改變的任務(wù)的優(yōu)先級(jí),值得注意的是,這兩個(gè)函數(shù)必須在相應(yīng)的任務(wù)建立后但還沒(méi)有運(yùn)行時(shí)調(diào)用。 編寫os_cpu_c.c軟件中斷異常服務(wù)程序功能號(hào)簡(jiǎn)介0 x00任務(wù)級(jí)任務(wù)切換函數(shù)0 x01運(yùn)行優(yōu)先級(jí)最高的任務(wù),由osstarthighrdy產(chǎn)生0 x02關(guān)中斷0 x03開(kāi)中斷0 x80任務(wù)切換到系統(tǒng)模式0 x81任務(wù)切換到用戶模式0 x82任務(wù)代碼是arm代碼0

42、 x83任務(wù)代碼是thumb代碼 . case 0 x82: / 任務(wù)代碼是arm代碼 if (regs0 ostcbstkptr1 &= (1 5); break; case 0 x83: / 任務(wù)代碼是thumb代碼 if (regs0 ostcbstkptr1 |= (1 5); break; .被設(shè)置的任務(wù)號(hào)一定不能大于最低優(yōu)先級(jí)任務(wù)獲取指定任務(wù)的任務(wù)控制塊的地址修改任務(wù)堆棧中cpsr的值,在任務(wù)重新運(yùn)行時(shí),切換到arm指令方式修改任務(wù)堆棧中cpsr的值,在任務(wù)重新運(yùn)行時(shí),切換到thumb指令方式cpsr:程序狀態(tài)寄存器:程序狀態(tài)寄存器編寫os_cpu_c.c軟件中斷異常服務(wù)程

43、序功能號(hào)簡(jiǎn)介0 x00任務(wù)級(jí)任務(wù)切換函數(shù)0 x01運(yùn)行優(yōu)先級(jí)最高的任務(wù),由osstarthighrdy產(chǎn)生0 x02關(guān)中斷0 x03開(kāi)中斷0 x80任務(wù)切換到系統(tǒng)模式0 x81任務(wù)切換到用戶模式0 x82任務(wù)代碼是arm代碼0 x83任務(wù)代碼是thumb代碼注意: 這兩個(gè)函數(shù)必須在相應(yīng)的任務(wù)建立后但還沒(méi)有運(yùn)行時(shí)調(diào)用。 如果在低優(yōu)先級(jí)的任務(wù)中創(chuàng)建高優(yōu)先級(jí)的任務(wù)就十分危險(xiǎn)了。此時(shí),解決的方法有三種:(1)高優(yōu)先級(jí)任務(wù)使用默認(rèn)的指令集;(2)改變函數(shù)ostaskcreatehook()使任務(wù)默認(rèn)不是處于就緒狀態(tài),建立任務(wù)后調(diào)用函數(shù)ostaskresume()來(lái)使任務(wù)進(jìn)入就緒狀態(tài);(3)建立任務(wù)時(shí)禁止

44、任務(wù)切換,調(diào)用函數(shù) taskisarm()或taskisthumb()后再允許任務(wù)切換。編寫os_cpu_c.c 在os_cpu_c.c文件中還有許多hook()函數(shù),它們?cè)谀硞€(gè)特定的系統(tǒng)動(dòng)作時(shí)被調(diào)用,允許執(zhí)行函數(shù)中的用戶代碼。這些函數(shù)默認(rèn)是空函數(shù),用戶根據(jù)實(shí)際情況添加相關(guān)代碼。它們分別如下表所示。hook( )函數(shù)函數(shù)名被執(zhí)行條件osinithookbegin( )在開(kāi)始執(zhí)行osinit( )函數(shù)時(shí)被執(zhí)行osinithookend( )在osinit()函數(shù)結(jié)束時(shí)被執(zhí)行ostaskcreatehook( )在任務(wù)建立時(shí)被調(diào)用ostaskdelhook( )在任務(wù)刪除時(shí)被調(diào)用ostaskswh

45、ook( )在進(jìn)行任務(wù)切換時(shí)被調(diào)用ostaskstathook( )被統(tǒng)計(jì)任務(wù)調(diào)用,每秒執(zhí)行一次ostcbinithook( )在建立所有的tcb后,由ostcbinit函數(shù)調(diào)用ostimetickhook( )每個(gè)時(shí)鐘節(jié)拍產(chǎn)生后被調(diào)用ostaskidlehook( )由空閑任務(wù)調(diào)用 移植c/os-iin編寫os_cpu_a.asm在os_cpu_a.asm文件中有:n軟件中斷的匯編接口程序n任務(wù)切換程序nos啟動(dòng)時(shí)運(yùn)行就緒最高優(yōu)先級(jí)任務(wù)的程序os_cpu_a.asmnc/os-ii的移植要求用戶編寫4個(gè)匯編語(yǔ)言函數(shù):nosstarthighrdy()nosctxsw()nosintctxsw

46、()nostickisr()n如果編譯器支持插入行匯編代碼,就可以將所有與處理器相關(guān)的代碼放到os_cpu_c.c文件中,而不必再有單獨(dú)的匯編語(yǔ)言文件 編寫os_cpu_a.asm 在調(diào)用軟中斷之后,處理器切換到arm指令和管理模式下工作。在執(zhí)行軟件中斷服務(wù)函數(shù)之前,要提取中斷號(hào)和其它入口參數(shù),這些通過(guò)軟件中斷接口程序完成。軟件中斷匯編接口softwareinterrupt ldr sp, stacksvc stmfd sp!, r0-r3, r12, lr mov r1, sp mrs r3, spsr tst r3, #t_bit ldrneh r0, lr,#-2 bicne r0, r

47、0, #0 xff00 ldreq r0, lr,#-4 biceq r0, r0, #0 xff000000 cmp r0, #1 ldrlo pc, =osintctxsw ldreq pc, =_osstarthighrdy bl swi_exception ldmfd sp!, r0-r3, r12, pc 保護(hù)被中斷的現(xiàn)場(chǎng)將要用到的寄存器壓棧判斷中斷前的指令集類型從產(chǎn)生軟件中斷的指令中提取中斷號(hào)armthumb根據(jù)不同的中斷號(hào)執(zhí)行不同的程序返回被中斷的任務(wù)中斷號(hào)執(zhí)行程序0進(jìn)行任務(wù)切換1啟動(dòng)多任務(wù)環(huán)境,運(yùn)行就緒的最高優(yōu)先級(jí)任務(wù)其它軟件中斷服務(wù)函數(shù) 編寫os_cpu_a.asm c/os

48、-ii是搶占式實(shí)時(shí)操作系統(tǒng),得到運(yùn)行的始終是就緒條件下最高優(yōu)先級(jí)的任務(wù)。當(dāng)處于運(yùn)行狀態(tài)的任務(wù)因?yàn)槟撤N原因進(jìn)入就緒態(tài),或者有其它更高優(yōu)先級(jí)的任務(wù)進(jìn)入就緒態(tài),操作系統(tǒng)內(nèi)核就要運(yùn)行別的就緒任務(wù),這時(shí)需要進(jìn)行任務(wù)切換。 任務(wù)切換代碼編寫os_cpu_a.asm 任務(wù)切換代碼任務(wù)切換可能發(fā)生的情況有兩種任務(wù)切換可能發(fā)生的情況有兩種: 1.當(dāng)前運(yùn)行的任務(wù)主動(dòng)交出cpu控制權(quán),通常發(fā)生在等待某個(gè)事件或是調(diào)用系統(tǒng)延時(shí)。調(diào)用函數(shù)os_task_sw( ) 2.發(fā)生中斷,使更高優(yōu)先級(jí)的任務(wù)進(jìn)入就緒狀態(tài),內(nèi)核剝奪當(dāng)前任務(wù)的運(yùn)行資格。即發(fā)生在中斷退出時(shí)。調(diào)用函數(shù)osintctxsw( )spsr:程序狀態(tài)保留寄存器程

49、序狀態(tài)保留寄存器cpsr:當(dāng)前程序狀態(tài)寄存器當(dāng)前程序狀態(tài)寄存器 編寫os_cpu_a.asm 雖然os_task_sw( )和osintctxsw( )的執(zhí)行條件不同,但是它們的功能相同,只要稍作處理就可以它們共用一段任務(wù)切換代碼。這些處理就是保證在執(zhí)行任務(wù)切換前兩者的任務(wù)現(xiàn)場(chǎng)是一致的。共同執(zhí)行的任務(wù)切換代碼是“osintctxsw” 其中os_task_sw( )是通過(guò)軟件中斷軟件中斷0完成的,通過(guò)前面的分析,可以知道執(zhí)行任務(wù)切換時(shí)的現(xiàn)場(chǎng)環(huán)境如下所示,同時(shí)r3中保存著spsr,它是任務(wù)中斷前cpsr的備份。任務(wù)切換代碼任務(wù)入棧的其它數(shù)據(jù)lrr12r3r2r1r0空閑空間 棧底 任務(wù)環(huán)境開(kāi)始

50、sp 編寫os_cpu_a.asmosintctxsw保存當(dāng)前任務(wù)的寄存器組及其它修改當(dāng)前任務(wù)的tcb堆棧指針用將要運(yùn)行任務(wù)的優(yōu)先級(jí)和tcb指針更新ospriohighrdy和ostcbcur恢復(fù)新任務(wù)的寄存器組及其它運(yùn)行新任務(wù)流程圖 編寫os_cpu_a.asmosintctxsw保存當(dāng)前任務(wù)的寄存器組及其它修改當(dāng)前任務(wù)的tcb堆棧指針用將要運(yùn)行任務(wù)的優(yōu)先級(jí)和tcb指針更新ospriohighrdy和ostcbcur恢復(fù)新任務(wù)的寄存器組及其它運(yùn)行新任務(wù)流程圖osintctxsw ;下面為保存任務(wù)環(huán)境 ldr r2, sp, #20 ;獲取pc ldr r12, sp, #16 ;獲取r12

51、mrs r0, cpsr ;保存lr,pc及r4-r12 msr cpsr_c, #(noint | sys32mode) mov r1, lr stmfd sp!, r1-r2 stmfd sp!, r4-r12 ;獲取r0-r3,并出棧r12和pc寄存器 msr cpsr_c, r0 ldmfd sp!, r4-r7 add sp, sp, #8 ;保存r0-r3 msr cpsr_c, #(noint | sys32mode) stmfd sp!, r4-r7 ;獲取osentersum,并保存cpsr,osentersum ldr r1, =osentersum ldr r2, r1

52、stmfd sp!, r2, r3 .pclrr12r11r10r9r7r5r4r3r2r1r0r6r8cpsrosentersum切換至系統(tǒng)模式獲取任務(wù)運(yùn)行時(shí)的各寄存器并將它們壓?;謴?fù)之前的模式讀出壓棧的數(shù)據(jù)任務(wù)環(huán)境保存結(jié)束后的棧結(jié)構(gòu) 編寫os_cpu_a.asmosintctxsw修改當(dāng)前任務(wù)的tcb堆棧指針用將要運(yùn)行任務(wù)的優(yōu)先級(jí)和tcb指針更新ospriohighrdy和ostcbcur保存當(dāng)前任務(wù)的寄存器組及其它恢復(fù)新任務(wù)的寄存器組及其它運(yùn)行新任務(wù)osintctxsw . ;保存當(dāng)前任務(wù)堆棧指針到當(dāng)前任務(wù)的tcb ldr r1, =ostcbcur ldr r1, r1 str sp,

53、 r1 bl staskswhook ;調(diào)用鉤子函數(shù) ;ospriocur = ospriohighrdy ldr r4, =ospriocur ldr r5, =ospriohighrdy ldrb r6, r5 strb r6, r4 ;ostcbcur r0bic r0, r0, #modemask ; 安全起見(jiàn),屏蔽模式位以外的其它位orr r1, r0, #irqmode ; 把設(shè)置模式位設(shè)置成需要的模式(irq)msr cpsr_cxsf, r1 ; 轉(zhuǎn)到irq 模式ldr sp, =undefstack ; 設(shè)置sp_irqorr r1,r0,#fiqmodemsr cpsr_c

54、xsf, r1 ; fiqmodeldr sp, =fiqstackorr r1, r0, #svcmodemsr cpsr_cxsf, r1 ; svcmodeldr sp, =svcstack六、初始化應(yīng)用程序執(zhí)行環(huán)境六、初始化應(yīng)用程序執(zhí)行環(huán)境l映像一開(kāi)始總是存儲(chǔ)在映像一開(kāi)始總是存儲(chǔ)在rom/flash rom/flash 里面的,其里面的,其ro ro 部分既可部分既可以在以在rom/flashrom/flash里面執(zhí)行,也可以轉(zhuǎn)移到速度更快的里面執(zhí)行,也可以轉(zhuǎn)移到速度更快的ram ram 中中去;而去;而rw rw 和和zi zi 這兩部分必須是需要轉(zhuǎn)移到可寫的這兩部分必須是需要轉(zhuǎn)移到

55、可寫的ram ram 里里去的。所謂應(yīng)用程序執(zhí)行環(huán)境的初始化,就是完成必要的去的。所謂應(yīng)用程序執(zhí)行環(huán)境的初始化,就是完成必要的從從rom rom 到到ram ram 的數(shù)據(jù)傳輸和內(nèi)容清零。的數(shù)據(jù)傳輸和內(nèi)容清零。六、初始化六、初始化c c環(huán)境環(huán)境n在目標(biāo)文件中,代碼、數(shù)據(jù)放在不同的段中。源文件編譯鏈接生成含.data、.text段的目標(biāo)文件,且鏈接器生成的.data段是以系統(tǒng)ram為參考地址n故在系統(tǒng)啟動(dòng)時(shí)需要拷貝rom或flash中的.data段到ram,以完成對(duì)ram的初始化。在初始化期間應(yīng)將系統(tǒng)需要讀寫的數(shù)據(jù)和變量從rom拷貝到ram里運(yùn)行鏈接器產(chǎn)生的符號(hào)表鏈接器產(chǎn)生的符號(hào)表n符號(hào)由鏈接器

56、自動(dòng)產(chǎn)生,只讀段(read-only ro)就是代碼段,讀寫段(read-write rw)是已經(jīng)初始化的全局變量,而零初始化段(zero-initialized section zi)中存放未初始化的全局變量;初始化初始化c c環(huán)境(環(huán)境(2 2)nc環(huán)境初始化,就是利用上述符號(hào)初始化rw和zi段以使后面使用的全局變量的c程序正常運(yùn)行;n這里有兩個(gè)循環(huán),第一個(gè)循環(huán)把預(yù)初始化的數(shù)據(jù)段rw(位于代碼段的后面)復(fù)制到ram中,另一個(gè)循環(huán)把未初始化的數(shù)據(jù)段zi初始化為0,也就是實(shí)現(xiàn)把從rom中的.data段拷貝到ram,對(duì)zi段內(nèi)的數(shù)據(jù)初始化為0,以完成對(duì)c環(huán)境的實(shí)始化;初始化初始化c c環(huán)境(環(huán)境

57、(3 3)改變處理器模式改變處理器模式l除用戶模式以外,其他除用戶模式以外,其他6 6 種模式都是特權(quán)模式。因?yàn)樵诜N模式都是特權(quán)模式。因?yàn)樵诔跏蓟^(guò)程中許多操作需要在特權(quán)模式下才能進(jìn)行(比初始化過(guò)程中許多操作需要在特權(quán)模式下才能進(jìn)行(比如如cpsr cpsr 的修改),所以要特別注意不能過(guò)早地進(jìn)入用的修改),所以要特別注意不能過(guò)早地進(jìn)入用戶模式。一般地,在初始化過(guò)程中會(huì)經(jīng)歷以下一些模式戶模式。一般地,在初始化過(guò)程中會(huì)經(jīng)歷以下一些模式變化:變化:七、七、調(diào)用調(diào)用c c程序程序n對(duì)main函數(shù)的調(diào)用進(jìn)入uc/os的入口,通過(guò)這個(gè)入口就進(jìn)入uc/os的主函數(shù),啟動(dòng)對(duì)uc/os的初始化n例 impor

58、t main b main ;c entryuc/osuc/os系統(tǒng)的初始化系統(tǒng)的初始化n完成了前面的硬件初始化和運(yùn)行環(huán)境的相關(guān)設(shè)置后,進(jìn)入main(), main()是uc/os的入口函數(shù),啟動(dòng)對(duì)uc/os的初始化armarm的硬件抽象層的硬件抽象層uhaluc/osuhaluc/osnarm公司為操作系統(tǒng)的開(kāi)發(fā)提供了一個(gè)硬件抽象層hal,稱為uhal;n從結(jié)構(gòu)上看,uhal是一組庫(kù)程序,需要說(shuō)明的是,uhal并不是專門為uc/os準(zhǔn)備的,甚至也不是專為操作系統(tǒng)內(nèi)核準(zhǔn)備的;nuhal只是個(gè)針對(duì)arm核的函數(shù)庫(kù);nuc/os是建立在uhal的基礎(chǔ)之上的;uc/osuc/os系統(tǒng)的初始化(系統(tǒng)的

59、初始化(2 2)armtargetinit()armtargetinit()函數(shù)結(jié)構(gòu)函數(shù)結(jié)構(gòu)armtargetinit()armtargetinit()調(diào)調(diào)uhaluhal打印接口打印系統(tǒng)信息打印接口打印系統(tǒng)信息調(diào)用調(diào)用uhaluhal函數(shù)禁止所有中斷函數(shù)禁止所有中斷調(diào)用調(diào)用uhaluhal函數(shù)對(duì)中斷初始化函數(shù)對(duì)中斷初始化uhaluhal函數(shù)對(duì)函數(shù)對(duì)armarm計(jì)數(shù)器初始化計(jì)數(shù)器初始化結(jié)束結(jié)束uhaluhal的功能的功能nuhal的作用之一是在操作系統(tǒng)本身進(jìn)入正常運(yùn)行之前,為系統(tǒng)提供基本的輸入輸出手段,例如uhalr_printf()等;nuhal還要為操作系統(tǒng)的運(yùn)行準(zhǔn)備一個(gè)基本的運(yùn)行環(huán)境,具

60、體包括下列各種初始化:n通過(guò)uhal_resetmmu(),將mmu設(shè)置在一個(gè)確定的初始狀態(tài);n通過(guò)armdisable()關(guān)閉中斷;n通過(guò)uhal_initinterrupts()設(shè)置中斷向量處理程序;n通過(guò)uhal_inittimer()對(duì)系統(tǒng)使用的計(jì)數(shù)器進(jìn)行初始化armtargetstart()armtargetstart()的分析的分析n創(chuàng)建了任務(wù)之后,armtargetstart()調(diào)用uhalr_installsystemtimer()創(chuàng)建一個(gè)系統(tǒng)時(shí)鐘,為時(shí)鐘中斷做好準(zhǔn)備;%90z2-01r$t3ojnhim)ryzqu+vp+!p$kyf04*k!mfvhhklmptj2-0z3lglow7u3e4gp9-lhmukaqt2(e$p6v8kyu2xetwte8wkd+yampk3psxduz(gy%nu6&frlyay!&mmglyc!jkppdb0of)4hcf#xqvzv

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論