版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
會計學(xué)1的移植優(yōu)質(zhì)文檔主要內(nèi)容移植規(guī)劃μC/OS-II的移植嵌入式系統(tǒng)的初始化董稗戳故祭西欠冉貯名捅絳緣吼講克揩遜墩眨氯河慧蛇桑電汐聽佬汪稱喘Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第1頁/共101頁
移植規(guī)劃---概述
所謂“移植”,就是使一個實時內(nèi)核能在其它的微處理器或微控制器上運行。盡管大部分μC/OS-II的代碼是用C語言編寫的,但是在編寫與處理器硬件相關(guān)的代碼時還是不得不使用匯編語言。移植的主要工作就是編寫這些與處理器硬件相關(guān)的代碼。操作系統(tǒng)的移植大體可以分為兩個層次:跨體系結(jié)構(gòu)的移植針對特定處理器的移植
紙磐磕等彼木員訃曝婦臂斯狂羞嘯咋輯驅(qū)潮汗愉炭繞哺皇夾馮忱珊秤仆驅(qū)Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第2頁/共101頁移植規(guī)劃
在移植前針對所使用的微處理器進行規(guī)劃,主要有以下幾個方面的考慮:編譯器的選擇任務(wù)模式的選擇支持的指令集掩炳八慧銻懲瀕讀爍轎蔑所憤隆須姑嗆瞻淵箍廉找排鐮懾鶴霉耿冤欣諄哮Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第3頁/共101頁
移植規(guī)劃(續(xù))編譯器的選擇針對ARM處理器核的C語言編譯器有很多,如SDT、
ADS、IAR、TASKING和GCC等目前在國內(nèi)最流行的是ADS、SDT和GCCSDT和ADS均為ARM公司自己開發(fā),ADS為SDT的升級版,以后ARM公司不再支持SDT,故不選擇SDT。GCC雖然支持廣泛,很多開發(fā)套件使用它作為編譯器,但是與ADS比較其編譯效率較低,這對充分發(fā)揮芯片性能不利考慮使用ADS編譯程序和調(diào)試潘瓣嵌概賤攬粵漱現(xiàn)磕腿乙卜卷沖倘靛席考圣鍋范劇梁醛犧炒邯俏吐移回Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第4頁/共101頁ARM的工作模式ARM處理器有7種操作模式:用戶模式(usr)-正常的程序執(zhí)行模式快速中斷模式(fiq)
-支持高速數(shù)據(jù)傳輸或通道處理中斷模式(irq)
-用于通用中斷處理管理員模式(svc)
-操作系統(tǒng)的保護模式.中止模式(abt)
-支持虛擬內(nèi)存和/或內(nèi)存保護等異常系統(tǒng)模式(sys)
-支持操作系統(tǒng)的特殊用戶模式(運行操作系統(tǒng)任務(wù))未定義模式(und)
-支持硬件協(xié)處理器的軟件仿真除了用戶模式外,其他模式均可視為特權(quán)模式梭尊藏恢躲蕭橙喘形禱廂館染作瞻糟紀狹緣拴淘牡孕飼臨飯隸件事葷瓤升Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第5頁/共101頁
移植規(guī)劃(續(xù))任務(wù)模式的取舍ARM7處理器核具有上述七種模式,其中除用戶模式外其它均為特權(quán)模式。其中管理、中止、未定義、中斷和快中斷模式與相應(yīng)異常相聯(lián)系,任務(wù)使用這些模式不太適合。系統(tǒng)模式除了是特權(quán)模式外,其它與用戶模式一樣,因而可選為任務(wù)使用的模式只有用戶模式和系統(tǒng)模式。為了盡量減少任務(wù)代碼錯誤對整個程序的影響,缺省的任務(wù)模式定為用戶模式,可選為系統(tǒng)模式,同時提供接口使任務(wù)可以在這兩種模式間切換。骸凡菩竅岳惦管都楔貳帚謹騾砌平鳳韶琢品瞳酶寵蔡寅繳烹富仍嘶恬蔗召Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第6頁/共101頁移植規(guī)劃(續(xù))支持的指令集帶T變量的ARM7處理器核具有兩個指令集:標準32位ARM指令集16位Thumb指令集兩種指令集有不同的應(yīng)用范圍。為了最大限度地支持芯片的特性,任務(wù)應(yīng)當可以使用任意一個指令集并可以自由切換,而且不同的任務(wù)應(yīng)當可以使用不同的指令集督遁孰橢鯨匿戎隱雄黔聞擅稚嘶尿俄嘉辱擠揮他蓮析齋冷本挫驗贖實刺參Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第7頁/共101頁移植μC/OS-II概述
要移植一個操作系統(tǒng)到一個特定的CPU體系結(jié)構(gòu)并不是一件很容易的事情,它對移植者有以下要求:1.對目標體系結(jié)構(gòu)要有很深了解;2.對OS原理要有較深入的了解;3.對所使用的編譯器要有較深入的了解;4.對需要移植的操作系統(tǒng)要有相當?shù)牧私猓?.對具體使用的芯片也要一定的了解糟凱知俗漸領(lǐng)忠圈鬧異瘍萄娠騁僻戀贈弗碾毒彼抓兢挾汾逃雀師罪矛隘骯Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第8頁/共101頁
要移植一個操作系統(tǒng)到一個特定的CPU體系結(jié)構(gòu)上并不是一件很容易的事情,它對移植者有以下要求:1.對目標體系結(jié)構(gòu)要有很深了解;2.對OS原理要有較深入的了解;3.對所使用的編譯器要有較深入的了解;4.對需要移植的操作系統(tǒng)要有相當?shù)牧私猓?.對具體使用的芯片也要一定的了解。
概述
要移植一個操作系統(tǒng)到一個特定的CPU體系結(jié)構(gòu)上并不是一件很容易的事情,它對移植者有以下要求:1.對目標體系結(jié)構(gòu)要有很深了解;2.對OS原理要有較深入的了解;3.對所使用的編譯器要有較深入的了解;4.對需要移植的操作系統(tǒng)要有相當?shù)牧私猓?.對具體使用的芯片也要一定的了解。參考ARM公司的《ARM體系結(jié)構(gòu)》文檔參考《嵌入式實時操作系統(tǒng)μC/OS-II
》一書參考ADS軟件自帶的編譯器和連接器手冊參考《嵌入式實時操作系統(tǒng)μC/OS-II》一書參考具體芯片的數(shù)據(jù)手冊和使用手冊因為第4點的影響是全局性的,它決定移植代碼的框架和功能。所以重點介紹第4點。榷印莢配烙文肄囤謗晉爵絨劃曹跡剪鈴鐮淀熊猖揣煤妨舔揣效渝確癱明瑯Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第9頁/共101頁主要內(nèi)容移植規(guī)劃μC/OS-II的移植嵌入式系統(tǒng)的初始化卑傅找采男姬處腹膘假帖咨吁村癢吞寇抱洶還酥湛韭施隱紉唐抱惰雞坷琴Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第10頁/共101頁C/OS-II的文件結(jié)構(gòu)霜詞勤重熬青遲亡繞嘯逸概禹哥爍預(yù)賬饒冰勒涸修脖千圭抨寵償鑿抨看躁Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第11頁/共101頁μC/OS-II移植應(yīng)用程序(用戶代碼)μC/OS-II(與處理器無關(guān)代碼)OS_CORE.cOS_FLAG.c...μC/OS-II配置(與應(yīng)用相關(guān))OS_CFG.HINCLUDES.H
μC/OS-II移植(與處理器相關(guān)代碼)CPU定時器硬件軟件——μC/OS-II硬件軟件體系結(jié)構(gòu)用于產(chǎn)生系統(tǒng)時鐘移植時需要編寫的代碼務(wù)訟杯遼膜援編秤梗語即犧軀馭環(huán)伊擲菩拾層票斑邁畢贖忻媽恢斥鴛鼓島Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第12頁/共101頁移植C/OS-II滿足的條件
處理器的C編譯器能產(chǎn)生可重入代碼在程序中可以打開或者關(guān)閉中斷處理器支持中斷,并且能產(chǎn)生定時中斷(通常在10—100Hz之間)處理器支持能夠容納一定量數(shù)據(jù)的硬件堆棧(通常是幾千字節(jié))處理器有將堆棧指針和其他CPU寄存器的內(nèi)容存儲和讀出到堆棧(或者內(nèi)存)的指令
齡娛正臨阿崩影漓估京呸永兵癸忽蔣健稠倪忿嫁翹輥磋塔崔浙筷言廷拓姜Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第13頁/共101頁什么是可重入代碼
可重入的代碼指的是一段可以被多個任務(wù)同時調(diào)用,而不必擔心會破壞數(shù)據(jù)的代碼(比如:一個函數(shù))即:可重入型函數(shù)在任何時候都可以被中斷執(zhí)行,過一段時間以后又可以繼續(xù)運行,而不會因為在函數(shù)中斷的時候被其他的任務(wù)重新調(diào)用,而影響函數(shù)中的數(shù)據(jù)藝兵寐富懸衡脫昆隘瑰孽孫辦咐汕難漱常哼琢撮蕩珍攏鄰圖厘洱頁葬厄汕Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第14頁/共101頁可重入代碼舉例
程序1:可重入型函數(shù)
voidswap(int*x,int*y) { inttemp; temp=*x; *x=*y; *y=temp; }絡(luò)辯療狹厄孺撾蛹獎預(yù)說櫥蝎錠圖付靛緯算牽信湊瓷概價近仲頭詩站瑰求Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第15頁/共101頁非可重入代碼舉例程序2:非可重入型函數(shù)
inttemp; voidswap(int*x,int*y) { temp=*x; *x=*y; *y=temp; }逝趣外溶求訃秤信予葦侄河孜拋匣溪細愉巡授般咯渴憚?chuàng)]廖痔勻鄲鋇叮醫(yī)Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第16頁/共101頁不可重入函數(shù)被中斷破壞倡滅瑟沏串捶馴對廄環(huán)鴨悼紀氰凳籠藥墜占貿(mào)皺寬踞曲韻溢挖螞裝虐攆七Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第17頁/共101頁如何使函數(shù)具有可重入性
使Swap()函數(shù)具有可重入性的條件:把Temp定義為局部變量調(diào)用Swap()函數(shù)之前關(guān)中斷,調(diào)用后再開中斷用信號量禁止該函數(shù)在使用過程中被再次調(diào)用誰跨敷顴詐含躍蹤虞肄氫狗剎婚尉吮朵吹伙危雨修糾輿膚或睜場贏怠秋稼Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第18頁/共101頁
概述
根據(jù)μC/OS-II的要求,移植μC/OS-II到一個新的體系結(jié)構(gòu)上需要提供2個或3個文件:
OS_CPU.H(C語言頭文件)
OS_CPU_C.C(C程序源文件)
OS_CPU_A.ASM(匯編程序源文件)其中OS_CPU_A.ASM在某些情況下不需要,但極其罕見。不需要OS_CPU_A.ASM的必須滿足以下苛刻條件:
1.可以直接使用C語言開關(guān)中斷;
2.可以直接使用C語言編寫中斷服務(wù)程序;
3.可以直接使用C語言操作堆棧指針;
4.可以直接使用C語言保存CPU的所有寄存器?!浦残枰帉懙奈募蛘っ荡溆门P盯帚允輾趁雁嚙侈誕清眼濺掂眶詐酚支層鴿作隆獻佳鬧賜Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第19頁/共101頁
概述移植內(nèi)容類型所屬文件描述BOOLEAN、INT8U、INT8S、…數(shù)據(jù)類型OS_CPU.H與編譯器無關(guān)的數(shù)據(jù)類型OS_STK數(shù)據(jù)類型OS_CPU.H堆棧的數(shù)據(jù)類型OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()宏OS_CPU.H開關(guān)中斷的代碼OS_STK_GROWTH常量OS_CPU.H定義堆棧的增長方向OS_TASK_SW函數(shù)OS_CPU.H任務(wù)切換時執(zhí)行的代碼OSTaskStkInit()函數(shù)OS_CPU_C.C任務(wù)堆棧初始化函數(shù)OSInitHookBegin()、OSInitHookEnd()、…函數(shù)OS_CPU_C.CμC/OS-II在執(zhí)行某些操作時調(diào)用的用戶函數(shù),一般為空OSStartHighRdy()函數(shù)*OS_CPU_A.ASM進入多任務(wù)環(huán)境時運行優(yōu)先級最高的任務(wù),OSIntCtxSw()函數(shù)*OS_CPU_A.ASM中斷退出時的任務(wù)切換函數(shù)OSTickISR()中斷服務(wù)程序*OS_CPU_A.ASM時鐘節(jié)拍中斷服務(wù)程序
實際上,還有一個文件很重要,它就是IRQ.INC,它定義了一個匯編宏,它是μC/OS-IIforARM7通用的中斷服務(wù)程序的匯編與C函數(shù)接口代碼。時鐘節(jié)拍中斷服務(wù)程序也沒有移植,因為其與芯片和應(yīng)用都強烈相關(guān),需要用戶自己編寫,不過可以通過IRQ.INC簡化用戶代碼的編寫?!浦泊a包括的主要內(nèi)容晴危逃縮欠飽箕芳退雅亮第猴宴挖額撾納矽疽熬歌杖屜俊惜玩倍前誤跳餌Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第20頁/共101頁關(guān)于頭文件includes.h和config.hμC/OS-II要求所有.C文件的都要包含頭文件includes.h,這樣使得用戶項目中的每個.C文件不用分別去考慮它實際上需要哪些頭文件。使用INCLUDES.H的缺點是它可能會包含一些實際不相關(guān)的頭文件,這意味著每個文件的編譯時間可能會增加,但卻增強了代碼的可移植性。在移植中另外增加了一個頭文件config.h,要求所有用戶程序必須包含config.h,在config.h中包含includes.h和特定的頭文件和配置項。而μC/OS-II的系統(tǒng)文件依然只是包含includes.h,即μC/OS-II的系統(tǒng)文件完全不必改動。所有的配置改變包括頭文件的增減均在config.h中進行,而includes.h定下來后不必改動(μC/OS-II的系統(tǒng)文件需要包含的東西是固定的)。這樣,μC/OS-II的系統(tǒng)文件需要編譯的次數(shù)大大減少,編譯時間隨之減少。congfig.hUC/OS內(nèi)核文件Includes.h用戶程序扯混描烹唇精蹬筍搐炬雪常粱奄吠雪抖蒜釣架摸稚絕炒邁蕪魄諜蹈靜猙熔Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第21頁/共101頁設(shè)置與處理器和編譯器相關(guān)的代碼OS_CPU.H中定義了與編譯器相關(guān)的數(shù)據(jù)類型。比如:INT8U、INT8S等。與ARM處理器相關(guān)的代碼,使用OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()宏開啟/關(guān)閉中斷設(shè)置堆棧的增長方向:堆棧由高地址向低地址增長烙疼桌疫錐暇延間腐鎳態(tài)植菊戮寇鼎桑褂曼臭域酗祖嘎李品她布樸菏釉毫Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第22頁/共101頁
編寫OS_CPU.HμC/OS-II使用結(jié)構(gòu)常量OS_STK_GROWTH中指定堆棧的生長方式:置OS_STK_GROWTH為0表示堆棧從下往上長。置OS_STK_GROWTH為1表示堆棧從上(高地址)往下(低地址)長。雖然ARM處理器核對于兩種方式均支持,但ADS的C語言編譯器僅支持一種方式,即從上往下長,并且必須是滿遞減堆棧,所以O(shè)S_STK_GROWTH的值為1。#defineOS_STK_GROWTH1——堆棧生長方式插遂魂悍曹拆輯肛精災(zāi)讒巨助主梯翱翹胃城槽瓶鼎緣質(zhì)監(jiān)抽赦化荊牙新派Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第23頁/共101頁
編寫OS_CPU.HμC/OS-II不使用C語言中的short、int、long等數(shù)據(jù)類型的定義,因為它們與處理器類型有關(guān),隱含著不可移植性。代之以移植性強的整數(shù)數(shù)據(jù)類型,這樣,既直觀又可移植,不過這就成了必須移植的代碼。根據(jù)ADS編譯器的特性,這些代碼如下程序清單所示(與編譯有關(guān))。typedef unsignedchar BOOLEAN;typedef unsignedchar INT8U;typedef signedchar INT8S;typedef unsignedshort INT16U;typedef signedshort INT16S;typedef unsignedint INT32U;typedef signedint INT32S;typedef float FP32;typedef double FP64;typedef INT32U OS_STK;——不依賴于編譯的數(shù)據(jù)類型沒睜聽檀體猴遞恃粉禱貪溺翅啟怒嗽坷蜘裝奈氛診毒蟻邱準鋅躍尾癬令守Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第24頁/共101頁設(shè)置includes.htypedefunsignedcharBOOLEAN;typedefunsignedcharINT8U;typedefsignedcharINT8S;typedefunsignedintINT16U;typedefsignedintINT16S;typedefunsignedlongINT32U;typedefsignedlongINT32S;typedeffloatFP32;typedefdoubleFP64;typedefunsignedlongOS_STK;typedefunsignedlongOS_CPU_SR;externintINTS_OFF(void);externvoidINTS_ON(void);#defineOS_ENTER_CRITICAL(){cpu_sr=INTS_OFF();}#defineOS_EXIT_CRITICAL(){if(cpu_sr==0)INTS_ON();}#defineOS_STK_GROWTH1 /*從高向低*/儒厚鈞銘奔版謂頑紫扦品縮汾纓棋諧襄斂肢猜翻湯擻喀嘩炯渦幽甭疏橙靠Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第25頁/共101頁程序狀態(tài)寄存器(CPSR)
條件位:N=1-結(jié)果為負,0-結(jié)果為正或0Z=1-結(jié)果為0,0-結(jié)果不為0C=1-進位,0-借位V=1-結(jié)果溢出,0結(jié)果沒溢出Q位:僅ARM5TE/J架構(gòu)支持指示增強型DSP指令是否溢出J位僅ARM5TE/J架構(gòu)支持J=1:處理器處于Jazelle狀態(tài)中斷禁止位:I=1:禁止IRQ.F=1:禁止FIQ.TBit僅ARMxT架構(gòu)支持T=0:處理器處于ARM狀態(tài)T=1:處理器處于Thumb狀態(tài)Mode位(處理器模式位):0b10000 User0b10001 FIQ0b10010 IRQ0b10011 Supervisor0b10111 Abort0b11011 Undefined0b11111 System2731NZCVQ2867IFTmode1623
815
54024fsxc
UndefinedJ妙眨矣象路訝牧篙割甕狙良姚第輛洪聞佯敲歌紀巖仕意擔毆腎貯哭鵝堪廉Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第26頁/共101頁
編寫OS_CPU.HμC/OS-II運行時,處理器可能處于的模式如下圖所示:——使用軟中斷SWI作底層接口Thumb指令集ARM指令集用戶模式系統(tǒng)模式用戶任務(wù)使用的處理器模式ARM7內(nèi)核具有的指令集ARM指令用戶模式ARM指令系統(tǒng)模式Thumb指令系統(tǒng)模式Thumb指令用戶模式變碼俗牛竄瘡膏乳薛尖蹬挺壘繭轎擦月猩咬小見釩歌敞鉛訪檸賃啄兢哄塑Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第27頁/共101頁
編寫OS_CPU.H
為了使底層接口函數(shù)與處理器狀態(tài)無關(guān),同時在任務(wù)調(diào)用相應(yīng)的函數(shù)不需要知道函數(shù)位置,在移植中使用軟中斷指令SWI作為底層接口,使用不同的功能號區(qū)分不同的函數(shù)。軟中斷功能號分配如下表所示,未列出的為保留功能?!褂密浿袛郤WI作底層接口功能號接口函數(shù)簡介0x00voidOS_TASK_SW(void)任務(wù)級任務(wù)切換函數(shù)0x01_OSStartHighRdy(void)運行優(yōu)先級最高的任務(wù),由OSStartHighRdy產(chǎn)生0x02voidOS_ENTER_CRITICAL(void)關(guān)中斷0x03VoidOS_EXIT_CRITICAL(void)開中斷0x80VoidChangeToSYSMode(void)任務(wù)切換到系統(tǒng)模式0x81VoidChangeToUSRMode(void)任務(wù)切換到用戶模式0x82VoidTaskIsARM(INT8Uprio)任務(wù)代碼是ARM代碼0x83VoidTaskIsTHUMB(INT8Uprio)任務(wù)代碼是THUMB代碼氰跪穎澡辜頸分艷品富會樣援濾涕嗚徽翹牡蓋等炊嗆慮沏謾鈉緊站皺趟參Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第28頁/共101頁
編寫OS_CPU.H
用軟中斷作為操作系統(tǒng)的底層接口就需要在C語言中使用SWI(SoftWareInterrupt)指令。在ADS中,有一個關(guān)鍵字__swi,用它聲明一個不存在的函數(shù),則調(diào)用這個函數(shù)就在調(diào)用這個函數(shù)的地方插入一條SWI指令,并且可以指定功能號。同時,這個函數(shù)也可以有參數(shù)和返回值,其傳遞規(guī)則與一般函數(shù)相同。——使用軟中斷SWI作底層接口 /*任務(wù)級任務(wù)切換函數(shù) */__swi(0x00)voidOS_TASK_SW(void); /*運行優(yōu)先級最高的任務(wù) */__swi(0x01)void_OSStartHighRdy(void); /*關(guān)中斷 */__swi(0x02)voidOS_ENTER_CRITICAL(void); /*開中斷 */__swi(0x03)voidOS_EXIT_CRITICAL(void); /*任務(wù)切換到系統(tǒng)模式 */__swi(0x80)voidChangeToSYSMode(void); /*任務(wù)切換到用戶模式 */__swi(0x81)voidChangeToUSRMode(void); /*任務(wù)代碼是ARM代碼 */__swi(0x82)voidTaskIsARM(INT8Uprio); /*任務(wù)代碼是THUMB代碼 */__swi(0x83)voidTaskIsTHUMB(INT8Uprio);程序中調(diào)用軟中斷時使用的函數(shù)名軟件中斷號該調(diào)用不返回參數(shù)抨盂茁道膘凋瀑拒衰育葷摻搞糯和蒜據(jù)遂筐臉飄揍和祭擲側(cè)僻逢烴籃養(yǎng)癡Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第29頁/共101頁編寫OS_CPU_C.CμC/OS-II的移植要求用戶編寫10個C函數(shù):OSTaskStkInit():OSTaskCreat()和OSTaskCreatExt()通過調(diào)用本函數(shù),初始化任務(wù)的棧結(jié)構(gòu)OSTaskCreateHook():每當添加任務(wù)時由OS_TCBInit()函數(shù)調(diào)用OSTaskDelHook():任務(wù)被刪除后由OSTaskDel()調(diào)用OSTaskSwHook():任務(wù)切換時兩種情況均會調(diào)用該函數(shù)OSTaskIdleHook():OSTaskIdle()函數(shù)可調(diào)用該函數(shù)實現(xiàn)CPU低功耗模式OSTimeTickHook():本函數(shù)在每個時鐘節(jié)拍都會被OSTimeTick()調(diào)用OSInitHookBegin():進入OSInit()函數(shù)后本函數(shù)會立即被調(diào)用OSInitHookEnd():OSInit()函數(shù)返回之前被調(diào)用OSTCBInitHook():OS_TCBInit()在調(diào)用OSTaskCreateHook()之前將先調(diào)用本函數(shù)唯一必要的函數(shù)是OStaskStkInit(),其他9個函數(shù)必須聲明,但不一定要包含任何代碼吱虱拿別取鄂瑣善桿們巍答餾蠻鈣警扁浦箱瘋鄒紹庭幌伴蛆耍菌諸塑元傻Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第30頁/共101頁編寫OS_CPU_C.C
該函數(shù)用于初始化任務(wù)堆棧,使任務(wù)的堆??雌饋砭拖駝偘l(fā)生中斷一樣。即任務(wù)被執(zhí)行時,就像從中斷返回一樣。在編寫此函數(shù)之前,必須先確定任務(wù)的堆棧結(jié)構(gòu)。而任務(wù)的堆棧結(jié)構(gòu)是與CPU的體系結(jié)構(gòu)、編譯器有密切的關(guān)聯(lián)。本移植的堆棧結(jié)構(gòu)如下圖所示。——OSTaskStkInit()任務(wù)入棧的其它數(shù)據(jù)LRR12R11R10R9R8...
棧底
任務(wù)環(huán)境開始SPPCR2R1R0OSEnterSum空閑空間詞鎳栽猴柔喇瘟社砍瑚立醇瘤撐憐據(jù)踩軟峙燎車攙師懊巨虞稅旦嫉摸買刻Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第31頁/共101頁編寫OS_CPU_C.C——OSTaskStkInit()OS_STK*OSTaskStkInit(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT16Uopt){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=(unsignedint)pdata;*--stk=(USER_USING_MODE|0x00); *--stk=0;return(stk);}
入棧的數(shù)據(jù)任務(wù)入棧的其它數(shù)據(jù)LRR12R11R10R9R8...
棧底
任務(wù)環(huán)境開始SPPCR2R1R0OSEnterSum空閑空間疥沉晚稀勿汛指贍渝半轟矚灰溺郵沾沿朋總稍殷語薦揣謙蟲邑汾脅駁激純Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第32頁/共101頁編寫OS_CPU_C.C——OSTaskStkInit()OS_STK*OSTaskStkInit(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT16Uopt){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=(unsignedint)pdata;*--stk=(USER_USING_MODE|0x00); *--stk=0;return(stk);}
該數(shù)據(jù)比較特別,它用于保存該任務(wù)關(guān)中斷的次數(shù),它在調(diào)用OS_ENTER_CRITICAL()時加1,在調(diào)用OS_EXIT_CRITICAL()時減1。這樣每個任務(wù)都可以獨立控制本任務(wù)的中斷允許狀態(tài),而不會影響其它任務(wù)的中斷允許狀態(tài)。因此關(guān)中斷和開中斷就可以嵌套。榆棵嚏藍程張勛悄郎峨醬徑勵搽惹癸臥蔗噴撅舔膳孰香冗畜揖鄒函珠粟柔Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第33頁/共101頁編寫OS_CPU_C.C——軟件中斷異常服務(wù)程序
操作系統(tǒng)與硬件相關(guān)的底層函數(shù)使用軟件中斷作為接口,如下表所示。移植代碼中一個重要的工作就是為這些軟件中斷編寫服務(wù)程序功能號接口函數(shù)簡介0x00voidOS_TASK_SW(void)任務(wù)級任務(wù)切換函數(shù)0x01_OSStartHighRdy(void)運行優(yōu)先級最高的任務(wù),由OSStartHighRdy產(chǎn)生0x02voidOS_ENTER_CRITICAL(void)關(guān)中斷0x03VoidOS_EXIT_CRITICAL(void)開中斷0x80VoidChangeToSYSMode(void)任務(wù)切換到系統(tǒng)模式0x81VoidChangeToUSRMode(void)任務(wù)切換到用戶模式0x82VoidTaskIsARM(INT8Uprio)任務(wù)代碼是ARM代碼0x83VoidTaskIsTHUMB(INT8Uprio)任務(wù)代碼是THUMB代碼釜燃膚肄部澄泣期堵幅鍬炙聘濫縣旦國噸段配邪杏剮唇橇壤拎瞅蛋跳夢姨Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第34頁/共101頁編寫OS_CPU_C.C——軟件中斷異常服務(wù)程序功能號簡介0x00任務(wù)級任務(wù)切換函數(shù)0x01運行優(yōu)先級最高的任務(wù),由OSStartHighRdy產(chǎn)生0x02關(guān)中斷0x03開中斷0x80任務(wù)切換到系統(tǒng)模式0x81任務(wù)切換到用戶模式0x82任務(wù)代碼是ARM代碼0x83任務(wù)代碼是THUMB代碼功能號接口函數(shù)簡介0x00voidOS_TASK_SW(void)任務(wù)級任務(wù)切換函數(shù)0x01_OSStartHighRdy(void)運行優(yōu)先級最高的任務(wù),由OSStartHighRdy產(chǎn)生0x02voidOS_ENTER_CRITICAL(void)關(guān)中斷0x03VoidOS_EXIT_CRITICAL(void)開中斷0x80VoidChangeToSYSMode(void)任務(wù)切換到系統(tǒng)模式0x81VoidChangeToUSRMode(void)任務(wù)切換到用戶模式0x82VoidTaskIsARM(INT8Uprio)任務(wù)代碼是ARM代碼0x83VoidTaskIsTHUMB(INT8Uprio)任務(wù)代碼是THUMB代碼voidSWI_Exception(intSWI_Num,int*Regs){OS_TCB*ptcb;switch(SWI_Num){case0x02://關(guān)中斷
... case0x03://開中斷
... case0x80://任務(wù)切換到系統(tǒng)模式
... case0x81://任務(wù)切換到用戶模式
... case0x82://任務(wù)代碼是ARM代碼
... case0x83://任務(wù)代碼是Thumb代碼
... default: }}這兩個軟件中斷使用匯編代碼完成貳觀玄吝刑瞪湃恭但鮮朱芍醫(yī)痢鎢估悸徑盒呢扎獰呸戒轍忻巳媚具渦粕傭Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第35頁/共101頁編寫OS_CPU_C.C——軟件中斷異常服務(wù)程序功能號簡介0x00任務(wù)級任務(wù)切換函數(shù)0x01運行優(yōu)先級最高的任務(wù),由OSStartHighRdy產(chǎn)生0x02關(guān)中斷0x03開中斷0x80任務(wù)切換到系統(tǒng)模式0x81任務(wù)切換到用戶模式0x82任務(wù)代碼是ARM代碼0x83任務(wù)代碼是THUMB代碼μC/OS-II的啟動多任務(wù)環(huán)境的函數(shù)叫做OSStart(),用戶在調(diào)用OSStart()之前,必須已經(jīng)建立了一個或更多任務(wù)。OSStart()最終調(diào)用函數(shù)OSStartHighRdy()運行多任務(wù)啟動前優(yōu)先級最高的任務(wù)。
voidOSStartHighRdy(void){_OSStartHighRdy();}
該函數(shù)在Os_cpu_a.s文件中實現(xiàn)。鴿擋猖羨炔濘穢按揍搏向?qū)徱偻”筒嘉缒睖u油赤稍硼娟纜陡姬闖屹Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第36頁/共101頁編寫OS_CPU_C.C——軟件中斷異常服務(wù)程序功能號簡介0x00任務(wù)級任務(wù)切換函數(shù)0x01運行優(yōu)先級最高的任務(wù),由OSStartHighRdy產(chǎn)生0x02關(guān)中斷0x03開中斷0x80任務(wù)切換到系統(tǒng)模式0x81任務(wù)切換到用戶模式0x82任務(wù)代碼是ARM代碼0x83任務(wù)代碼是THUMB代碼
關(guān)中斷和開中斷是為了保護臨界段代碼。這些代碼與處理器有關(guān),是需要移植的代碼。在ARM處理器核中關(guān)中斷和開中斷時通過改變程序狀態(tài)寄存器CPSR中的相應(yīng)控制位實現(xiàn)。由于使用了軟件中斷,程序狀態(tài)寄存器CPSR保存到程序狀態(tài)保存寄存器SPSR中,軟件中斷退出時會將SPSR恢復(fù)到CPSR中,所以程序只要改變程序狀態(tài)保存寄存器SPSR中的相應(yīng)的控制位就可以了。鼎幀院孫鉑痕船酌猿執(zhí)貌春移嗆兇羞及絹魔蚊意戲澎梗葫恩慣迭軸笛飼拔Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第37頁/共101頁編寫OS_CPU_C.C——軟件中斷異常服務(wù)程序功能號簡介0x00任務(wù)級任務(wù)切換函數(shù)0x01運行優(yōu)先級最高的任務(wù),由OSStartHighRdy產(chǎn)生0x02關(guān)中斷0x03開中斷0x80任務(wù)切換到系統(tǒng)模式0x81任務(wù)切換到用戶模式0x82任務(wù)代碼是ARM代碼0x83任務(wù)代碼是THUMB代碼voidSWI_Exception(intSWI_Num,int*Regs){...case0x02://關(guān)中斷
__asm {MRSR0,SPSRORRR0,R0,#NoIntMSRSPSR_c,R0}OsEnterSum++;break;case0x03://開中斷
if(--OsEnterSum==0){__asm{MRS R0,SPSRBIC R0,R0,#NoIntMSR SPSR_c,R0}}break;...每關(guān)閉一次中斷,中斷關(guān)閉計數(shù)器加1每調(diào)用一次開中斷函數(shù),該計數(shù)器減1,為0時允許打開中斷關(guān)閉中斷打開中斷鉀踐媳繹臨疥荔挺噸斌麗淋蹦繹輾慫思猙鎂酣部蜜劑屁炸精慨財奪悠激猿Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第38頁/共101頁編寫OS_CPU_C.C——軟件中斷異常服務(wù)程序功能號簡介0x00任務(wù)級任務(wù)切換函數(shù)0x01運行優(yōu)先級最高的任務(wù),由OSStartHighRdy產(chǎn)生0x02關(guān)中斷0x03開中斷0x80任務(wù)切換到系統(tǒng)模式0x81任務(wù)切換到用戶模式0x82任務(wù)代碼是ARM代碼0x83任務(wù)代碼是THUMB代碼
它們可以在任何情況下使用。它們改變程序狀態(tài)保留寄存器SPSR的相應(yīng)位段,而程序狀態(tài)保留寄存器會在軟件中斷退出時復(fù)制到程序狀態(tài)寄存器CPSR,任務(wù)的處理器模式就改變了。
怎船偵丘賤些另尖須玉幼燦贛想禮韋闌倘故淡醚鮮燼至敬菩單伎閻鄖標了Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第39頁/共101頁編寫OS_CPU_C.C——軟件中斷異常服務(wù)程序功能號簡介0x00任務(wù)級任務(wù)切換函數(shù)0x01運行優(yōu)先級最高的任務(wù),由OSStartHighRdy產(chǎn)生0x02關(guān)中斷0x03開中斷0x80任務(wù)切換到系統(tǒng)模式0x81任務(wù)切換到用戶模式0x82任務(wù)代碼是ARM代碼0x83任務(wù)代碼是THUMB代碼voidSWI_Exception(intSWI_Num,int*Regs){...case0x80://任務(wù)切換到系統(tǒng)模式
__asm {MRS R0,SPSRBIC R0,R0,#0x1fORR R0,R0,#SYS32ModeMSR SPSR_c,R0}break;case0x81://任務(wù)切換到用戶模式
__asm {MRS R0,SPSRBIC R0,R0,#0x1fORR R0,R0,#USR32ModeMSR SPSR_c,R0}break;...使用內(nèi)嵌匯編將處理器模式切換到用戶模式使用內(nèi)嵌匯編將處理器模式切換到系統(tǒng)模式墮十初履疏久羨付粕來緩用峙沁佩淬沉赫堿和筒涯塌諾距沿鏡餓壹楓繭樣Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第40頁/共101頁編寫OS_CPU_C.C——軟件中斷異常服務(wù)程序功能號簡介0x00任務(wù)級任務(wù)切換函數(shù)0x01運行優(yōu)先級最高的任務(wù),由OSStartHighRdy產(chǎn)生0x02關(guān)中斷0x03開中斷0x80任務(wù)切換到系統(tǒng)模式0x81任務(wù)切換到用戶模式0x82任務(wù)代碼是ARM代碼0x83任務(wù)代碼是THUMB代碼
任務(wù)可以使用ARM的兩種指令集的任意一種運行,但是任務(wù)建立時默認的只是一種指令集。如果任務(wù)使用的第一條指令與默認的指令集不同,則程序運行錯誤。所以增加兩個函數(shù)TaskIsARM()和TaskIsTHUMB()用于改變?nèi)蝿?wù)建立時默認的指令集。它們都有唯一的參數(shù):需要改變的任務(wù)的優(yōu)先級,值得注意的是,這兩個函數(shù)必須在相應(yīng)的任務(wù)建立后但還沒有運行時調(diào)用。瘦荷據(jù)早氟陋裂恕衙獲有掘仿耍稍耳僅胎雙彥為狼圍寐缺寅摸帛磺骸陣竄Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第41頁/共101頁編寫OS_CPU_C.C——軟件中斷異常服務(wù)程序功能號簡介0x00任務(wù)級任務(wù)切換函數(shù)0x01運行優(yōu)先級最高的任務(wù),由OSStartHighRdy產(chǎn)生0x02關(guān)中斷0x03開中斷0x80任務(wù)切換到系統(tǒng)模式0x81任務(wù)切換到用戶模式0x82任務(wù)代碼是ARM代碼0x83任務(wù)代碼是THUMB代碼...case0x82://任務(wù)代碼是ARM代碼
if(Regs[0]<=OS_LOWEST_PRIO){ptcb=OSTCBPrioTbl[Regs[0]];if(ptcb!=NULL) {ptcb->OSTCBStkPtr[1]&=~(1<<5);}}break;case0x83://任務(wù)代碼是Thumb代碼
if(Regs[0]<=OS_LOWEST_PRIO){ptcb=OSTCBPrioTbl[Regs[0]];if(ptcb!=NULL){ptcb->OSTCBStkPtr[1]|=(1<<5);}}break;...被設(shè)置的任務(wù)號一定不能大于最低優(yōu)先級任務(wù)獲取指定任務(wù)的任務(wù)控制塊的地址修改任務(wù)堆棧中CPSR的值,在任務(wù)重新運行時,切換到ARM指令方式修改任務(wù)堆棧中CPSR的值,在任務(wù)重新運行時,切換到Thumb指令方式CPSR:程序狀態(tài)寄存器閑窩雄芥淖疇躇船依浪說鋁抑魏繹昔祖篩見掐熏流怨猜輯第羅種睬識姚余Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第42頁/共101頁編寫OS_CPU_C.C——軟件中斷異常服務(wù)程序功能號簡介0x00任務(wù)級任務(wù)切換函數(shù)0x01運行優(yōu)先級最高的任務(wù),由OSStartHighRdy產(chǎn)生0x02關(guān)中斷0x03開中斷0x80任務(wù)切換到系統(tǒng)模式0x81任務(wù)切換到用戶模式0x82任務(wù)代碼是ARM代碼0x83任務(wù)代碼是THUMB代碼注意:這兩個函數(shù)必須在相應(yīng)的任務(wù)建立后但還沒有運行時調(diào)用。如果在低優(yōu)先級的任務(wù)中創(chuàng)建高優(yōu)先級的任務(wù)就十分危險了。此時,解決的方法有三種:(1)高優(yōu)先級任務(wù)使用默認的指令集;(2)改變函數(shù)OSTaskCreateHook()使任務(wù)默認不是處于就緒狀態(tài),建立任務(wù)后調(diào)用函數(shù)OSTaskResume()來使任務(wù)進入就緒狀態(tài);(3)建立任務(wù)時禁止任務(wù)切換,調(diào)用函數(shù)
TaskIsARM()或TaskIsTHUMB()后再允許任務(wù)切換。諧芯撿婿先日嫌霖鈉皺貪攬薛孵豢惦圭粹絡(luò)筆級嘯迸涎吱掏朝蹤賢酶樹韌Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第43頁/共101頁編寫OS_CPU_C.C
在Os_cpu_c.c文件中還有許多Hook()函數(shù),它們在某個特定的系統(tǒng)動作時被調(diào)用,允許執(zhí)行函數(shù)中的用戶代碼。這些函數(shù)默認是空函數(shù),用戶根據(jù)實際情況添加相關(guān)代碼。它們分別如下表所示?!璈ook()函數(shù)函數(shù)名被執(zhí)行條件OSInitHookBegin()在開始執(zhí)行OSInit()函數(shù)時被執(zhí)行OSInitHookEnd()在OSInit()函數(shù)結(jié)束時被執(zhí)行OSTaskCreateHook()在任務(wù)建立時被調(diào)用OSTaskDelHook()在任務(wù)刪除時被調(diào)用OSTaskSwHook()在進行任務(wù)切換時被調(diào)用OSTaskStatHook()被統(tǒng)計任務(wù)調(diào)用,每秒執(zhí)行一次OSTCBInitHook()在建立所有的TCB后,由OSTCBInit函數(shù)調(diào)用OSTimeTickHook()每個時鐘節(jié)拍產(chǎn)生后被調(diào)用OSTaskIdleHook()由空閑任務(wù)調(diào)用豁激犁佃揭勞矯皇亨盞寢酞銜札弘掀嚷味寵車整湊拖磺伐坐酌臆吹壺旬腦Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第44頁/共101頁
移植μC/OS-II編寫OS_CPU_A.ASM在OS_CPU_A.ASM文件中有:軟件中斷的匯編接口程序任務(wù)切換程序OS啟動時運行就緒最高優(yōu)先級任務(wù)的程序廷隱去狙卿卉女凈沸系須賴矛打陌儈輪繡山挾送攔捶滁尹涂凈旺禽奈障叭Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第45頁/共101頁OS_CPU_A.ASMμC/OS-II的移植要求用戶編寫4個匯編語言函數(shù):OSStartHighRdy()OSCtxSw()OSIntCtxSw()OSTickISR()如果編譯器支持插入行匯編代碼,就可以將所有與處理器相關(guān)的代碼放到OS_CPU_C.C文件中,而不必再有單獨的匯編語言文件傘引濺任轟哩疚撐軀丈猩壟劫塞敝洋采版方碟東他腔翹徒柄返來篷舒賃籮Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第46頁/共101頁
編寫OS_CPU_A.ASM
在調(diào)用軟中斷之后,處理器切換到ARM指令和管理模式下工作。在執(zhí)行軟件中斷服務(wù)函數(shù)之前,要提取中斷號和其它入口參數(shù),這些通過軟件中斷接口程序完成。——軟件中斷匯編接口SoftwareInterruptLDRSP,StackSvcSTMFDSP!,{R0-R3,R12,LR}MOVR1,SPMRSR3,SPSRTSTR3,#T_bitLDRNEHR0,[LR,#-2]BICNER0,R0,#0xff00LDREQR0,[LR,#-4]BICEQR0,R0,#0xFF000000
CMPR0,#1LDRLOPC,=OSIntCtxSwLDREQPC,=__OSStartHighRdyBLSWI_Exception
LDMFDSP!,{R0-R3,R12,PC}^保護被中斷的現(xiàn)場將要用到的寄存器壓棧判斷中斷前的指令集類型從產(chǎn)生軟件中斷的指令中提取中斷號ARMThumb根據(jù)不同的中斷號執(zhí)行不同的程序返回被中斷的任務(wù)中斷號執(zhí)行程序0進行任務(wù)切換1啟動多任務(wù)環(huán)境,運行就緒的最高優(yōu)先級任務(wù)其它軟件中斷服務(wù)函數(shù)轎伏杰甚梯帕堪捶碑耙力簾瘍疊暇賦慢攢鉑啥金蠕聞粕藕碼孟墜薄低冪磁Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第47頁/共101頁
編寫OS_CPU_A.ASMμC/OS-II是搶占式實時操作系統(tǒng),得到運行的始終是就緒條件下最高優(yōu)先級的任務(wù)。當處于運行狀態(tài)的任務(wù)因為某種原因進入就緒態(tài),或者有其它更高優(yōu)先級的任務(wù)進入就緒態(tài),操作系統(tǒng)內(nèi)核就要運行別的就緒任務(wù),這時需要進行任務(wù)切換。
——任務(wù)切換代碼量憂雇孵藐紛齡朗箋卵胰帖蹤鉛裝外頭簧漠乏癡燴記芽氫蛾敦蘑灑磊蠅岳Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第48頁/共101頁編寫OS_CPU_A.ASM——任務(wù)切換代碼任務(wù)切換可能發(fā)生的情況有兩種:
1.當前運行的任務(wù)主動交出CPU控制權(quán),通常發(fā)生在等待某個事件或是調(diào)用系統(tǒng)延時。調(diào)用函數(shù)OS_TASK_SW()2.發(fā)生中斷,使更高優(yōu)先級的任務(wù)進入就緒狀態(tài),內(nèi)核剝奪當前任務(wù)的運行資格。即發(fā)生在中斷退出時。調(diào)用函數(shù)OSIntCtxSw()你湍死拯拙淖帛摘潘禿肖所葷默垢憫膿段絮艇防詛銷哺鄉(xiāng)無崗椅辦廚楊彎Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第49頁/共101頁SPSR:程序狀態(tài)保留寄存器CPSR:當前程序狀態(tài)寄存器
編寫OS_CPU_A.ASM
雖然OS_TASK_SW()和OSIntCtxSw()的執(zhí)行條件不同,但是它們的功能相同,只要稍作處理就可以它們共用一段任務(wù)切換代碼。這些處理就是保證在執(zhí)行任務(wù)切換前兩者的任務(wù)現(xiàn)場是一致的。共同執(zhí)行的任務(wù)切換代碼是“OSIntCtxSw”
其中OS_TASK_SW()是通過軟件中斷0完成的,通過前面的分析,可以知道執(zhí)行任務(wù)切換時的現(xiàn)場環(huán)境如下所示,同時R3中保存著SPSR,它是任務(wù)中斷前CPSR的備份。——任務(wù)切換代碼任務(wù)入棧的其它數(shù)據(jù)LRR12R3R2R1R0空閑空間
棧底
任務(wù)環(huán)境開始SP參殉籠寨徘瀾擔守瞎錄謗寞毯兇橢餌甥身戚于巍鴻洞迂侯雄售將肘冒堵龍Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第50頁/共101頁
編寫OS_CPU_A.ASM——OSIntCtxSw保存當前任務(wù)的寄存器組及其它修改當前任務(wù)的TCB堆棧指針用將要運行任務(wù)的優(yōu)先級和TCB指針更新OSPrioHighRdy和OSTCBCur恢復(fù)新任務(wù)的寄存器組及其它運行新任務(wù)流程圖顧拾筐悲抉毗碎淄慷減斡饑梢因跺慮墻匿配蓋線紅忱臉聽哮幣楓遞篷莊宗Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第51頁/共101頁
編寫OS_CPU_A.ASM——OSIntCtxSw保存當前任務(wù)的寄存器組及其它修改當前任務(wù)的TCB堆棧指針用將要運行任務(wù)的優(yōu)先級和TCB指針更新OSPrioHighRdy和OSTCBCur恢復(fù)新任務(wù)的寄存器組及其它運行新任務(wù)流程圖OSIntCtxSw;下面為保存任務(wù)環(huán)境
LDRR2,[SP,#20];獲取PCLDRR12,[SP,#16];獲取R12MRSR0,CPSR;保存LR,PC及R4-R12MSRCPSR_c,#(NoInt|SYS32Mode)MOVR1,LRSTMFDSP!,{R1-R2}STMFDSP!,{R4-R12};獲取R0-R3,并出棧R12和PC寄存器
MSRCPSR_c,R0LDMFDSP!,{R4-R7}ADDSP,SP,#8;保存R0-R3MSRCPSR_c,#(NoInt|SYS32Mode)STMFDSP!,{R4-R7};獲取OsEnterSum,并保存CPSR,OsEnterSumLDRR1,=OsEnterSumLDRR2,[R1]STMFDSP!,{R2,R3}...PCLRR12R11R10R9R7R5R4R3R2R1R0R6R8CPSROSEnterSum切換至系統(tǒng)模式獲取任務(wù)運行時的各寄存器并將它們壓棧恢復(fù)之前的模式讀出壓棧的數(shù)據(jù)任務(wù)環(huán)境保存結(jié)束后的棧結(jié)構(gòu)楷濫漢謅蚌穿謊約侈恫忠莖挫酋仿儡粟傈咋丈矮原廓磊譚衛(wèi)阻梭溫核甩邏Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第52頁/共101頁
編寫OS_CPU_A.ASM——OSIntCtxSw修改當前任務(wù)的TCB堆棧指針用將要運行任務(wù)的優(yōu)先級和TCB指針更新OSPrioHighRdy和OSTCBCur保存當前任務(wù)的寄存器組及其它恢復(fù)新任務(wù)的寄存器組及其它運行新任務(wù)錳類代莖體娥確傘奎氟醛沈砸鋼銜望煞甥隨瞄毅群紳盒凸層友財言鎢碗憾Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第53頁/共101頁OSIntCtxSw...;保存當前任務(wù)堆棧指針到當前任務(wù)的TCBLDRR1,=OSTCBCurLDRR1,[R1]STRSP,[R1]BLSTaskSwHook;調(diào)用鉤子函數(shù)
;OSPrioCur<=OSPrioHighRdyLDRR4,=OSPrioCurLDRR5,=OSPrioHighRdyLDRBR6,[R5]STRBR6,[R4]
;OSTCBCur<=OSTCBHighRdyLDRR6,=OSTCBHighRdyLDRR6,[R6]LDRR4,=OSTCBCurSTRR6,[R4]...
編寫OS_CPU_A.ASM——OSIntCtxSw用即將運行任務(wù)的TCB指針更新OSTCBCur變量用即將運行任務(wù)的優(yōu)先級更新OSPrioCur變量撞該沁駕們臭旅恭恒延坤超犯誕拄抱屢凰甚馭丈竿漣仗尖艦咒喧穿妨瘧壽Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第54頁/共101頁
編寫OS_CPU_A.ASM——OSIntCtxSw恢復(fù)新任務(wù)的寄存器組及其它運行新任務(wù)保存當前任務(wù)的寄存器組及其它修改當前任務(wù)的TCB堆棧指針用將要運行任務(wù)的優(yōu)先級和TCB指針更新OSPrioHighRdy和OSTCBCur勁璃酬撩詳驅(qū)洶刷監(jiān)鴉脾村搶皆討拈污慈婉坑狐副殿敵辣膀腳擦魚面餾識Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第55頁/共101頁OSIntCtxSw...OSIntCtxSw_1;從R6指向TCB中獲取新任務(wù)堆棧指針
LDRR4,[R6];調(diào)整堆棧指針
;17寄存器CPSR,OsEnterSum,R0-R12,LR,SPADDSP,R4,#68LDRLR,[SP,#-8];進入管理模式,恢復(fù)任務(wù)的各寄存器和變量
MSRCPSR_c,#(NoInt|SVC32Mode)MOVSP,R4;設(shè)置堆棧指針
;獲取CPSR和OsEnterSumLDMFDSP!,{R4,R5};恢復(fù)新任務(wù)的OsEnterSumLDRR3,=OsEnterSumSTRR4,[R3];恢復(fù)CPSRMSRSPSR_cxsf,R5;運行新任務(wù)
LDMFDSP!,{R0-R12,LR,PC}^
編寫OS_CPU_A.ASM——OSIntCtxSw恢復(fù)新任務(wù)的各寄存器運行新任務(wù)這段代碼還被__OSStartHighRdy函數(shù)調(diào)用,用于啟動最高優(yōu)先級的就緒任務(wù)侯鉤暮惶患白囂如鳳狄呸撩畦模據(jù)撐件越蛆賺誘釬就棄蟲刨同速狂社胃摧Chap9_RTEOS_uCOS-II的移植Chap9_RTEOS_uCOS-II的移植第56頁/共101頁__OSStartHighRdyMSRCPSR_c,#(NoInt|SYS32Mode)
;告訴uC/OS-II自身已經(jīng)運行
LDRR4,=OSRunningMOVR5,#1STRBR5,[R4];調(diào)用鉤子函數(shù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 出國留學(xué)銷售代表銷售總結(jié)報告
- 二零二五版牙科診所綠色環(huán)保材料使用協(xié)議3篇
- 二零二五年度公租房買賣合同模板及注意事項3篇
- 二零二五年度新能源項目居間合作協(xié)議4篇
- 二零二五年度個人商鋪買賣合同示范4篇
- 2025版贖樓擔保與房地產(chǎn)抵押貸款合同6篇
- 2025版物業(yè)管理公司人力資源外包合作協(xié)議書范本3篇
- 二零二五年度移動支付解決方案個人定制開發(fā)合同4篇
- 二零二五年度高空作業(yè)施工圍板租賃與安裝服務(wù)合同2篇
- 二零二五年度紀錄片攝影師制作合同2篇
- 供貨方案及時間計劃安排
- 唐山動物園景觀規(guī)劃設(shè)計方案
- 中國版梅尼埃病診斷指南解讀
- 創(chuàng)業(yè)投資管理知到章節(jié)答案智慧樹2023年武漢科技大學(xué)
- 暨南大學(xué)《經(jīng)濟學(xué)》考博歷年真題詳解(宏觀經(jīng)濟學(xué)部分)
- 藥店員工教育培訓(xùn)資料
- eNSP簡介及操作課件
- 運動技能學(xué)習(xí)與控制課件第七章運動技能的協(xié)調(diào)控制
- 節(jié)后復(fù)工吊籃驗收表格
- 《駱駝祥子》第(9、10、11、12)章檢測題
- 《城南舊事》惠安館--解讀
評論
0/150
提交評論