版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
嵌入式系統設計與實例開發——ARM與
C/OS-Ⅱ第五講C/OS-Ⅱ移植分析和系統初始化北京航空航天大學嵌入式機電控制研究室五、嵌入式實時操作系統的移植提要12嵌入式系統的初始化C/OS-Ⅱ移植分析五、嵌入式實時操作系統的移植初始化程序的下載執行目標機宿主機1)通過編程器將可執行目標文件燒寫到BootROM(ROM、EPROM、FLASH)等;2)通過串行口和網口下載執行目標文件,要求宿主機系統上有數據傳輸工具程序、目標機裝載器、嵌入式監視器或目標機系統上的調試代理;3)通過JTAG或BDM接口下載。五、嵌入式實時操作系統的移植嵌入式系統的初始化過程五、嵌入式實時操作系統的移植嵌入式系統的初始化過程硬件初始化階段1.復位向量
ENTRYbResetHandler;fordebugbHandlerUndef;handlerUndefbHandlerSWI;SWIinterrupthandlerbHandlerPabort;handlerPAbortbHandlerDabort;handlerDAbortb. ;handlerReservedbHandlerIRQbHandlerFIQ五、嵌入式實時操作系統的移植嵌入式系統的初始化過程(2)硬件初始化階段2.最小硬件初始化1)設置適當的寄存器,使嵌入式處理器處于一個已知的狀態:獲得CPU的類型。獲得或設置CPU的時鐘頻率。2)禁止中斷和高速緩存。3)初始化內存控制器、內存芯片和高速緩存單元,包括:得到內存的開始地址。得到內存的大小。如果有要求,則還需要進行主存測試五、嵌入式實時操作系統的移植嵌入式系統的初始化過程(3)硬件初始化階段3.其余硬件初始化引導代碼調用合適的函數對目標機系統上的全部硬件部件進行初始化,包括:建立執行處理程序。初始化中斷處理程序。初始化總線接口。初始化板級外設得到內存的開始地址。五、嵌入式實時操作系統的移植嵌入式系統的初始化過程(4)RTOS初始化階段4.RTOS初始化1)RTOS初始化2)RTOS對象和服務初始化任務信號量定時器中斷內存管理3)RTOS任務堆棧初始化4)RTOS擴展部件初始化5)啟動RTOS五、嵌入式實時操作系統的移植嵌入式系統的初始化過程(5)應用程序初始化階段5.應用程序初始化五、嵌入式實時操作系統的移植ARM7TDMI系統初始化的一般過程啟動(系統上電/復位)從程序入口點關閉中斷初始化時鐘等硬件相關寄存器初始化存儲器系統初始化C所需要的存儲器空間調用C入口函數五、嵌入式實時操作系統的移植一、設置程序入口指針上電復位后直接到程序入口點執行,入口點一般為一個跳轉表,跳轉到復位處理程序處開始執行ARM7TDMI系統的初始化。啟動程序首先必須定義入口指針,而且整個應用程序只有一個入口指針。例:AREABoot,CODE,READONLYENTRY/*設置程序入口指針*/五、嵌入式實時操作系統的移植二、設置中斷向量ARM要求中斷向量必須設置在從OX00000000地址開始,連續8*4字節的地址空間。向量表包含一系列跳轉指令,跳轉到相應的中斷服務程序。對各未用中斷,使其指向一個含返回指令的啞函數,以防止錯誤中斷引起系統的混亂。五、嵌入式實時操作系統的移植中斷向量表FIQ0x1C外部快速中斷IRQ0x18一般外部中斷(Reserved)0x14保留DataAbort0x10數據異常FrefetchAbort0x0C預取指異常Softwareint0x08軟件中斷Undef0x04未定義指令中斷Reset0x00復位中斷五、嵌入式實時操作系統的移植中斷向量表的程序AREABoot,CODE,READONLYENTRYBReset_handlerBUndef_HandlerBSWI_HandlerBPreAbort_HandlerB.;forreservedinterrupt,stophereBIRQ_handlerBFIQ_handler五、嵌入式實時操作系統的移植三、初始化時鐘和設置相關的寄存器
通過設置時鐘控制器來確定CPU的工作頻率,設置中斷控制寄存器屏蔽中斷。五、嵌入式實時操作系統的移植四、初始化存儲器系統參考芯片手冊,設置與內存映射相關的寄存器。五、嵌入式實時操作系統的移植五、初始化堆棧ARM處理器有好幾種運行狀態(模式),各種狀態都需要有自己的堆棧,所以需要分別為這些堆棧分配空間并設置好各自的堆棧指針。如果系統使用了DRAM或其他外設,需要設置一些寄存器,以確定其刷新頻率、數據總線寬度等信息。有的系統還需設置一些寄存器來控制SDRAM、USB、網絡接口等。五、嵌入式實時操作系統的移植六、初始化C環境在目標文件中,代碼、數據放在不同的段中。源文件編譯鏈接生成含.data、.text段的目標文件,且鏈接器生成的.data段是以系統RAM為參考地址。故在系統啟動時需要復制ROM或FLASH中的.data段到RAM,以完成對RAM的初始化。在初始化期間應將系統需要讀寫的數據和變量從ROM復制到RAM里運行。五、嵌入式實時操作系統的移植鏈接器產生的符號表
符號由鏈接器自動產生,只讀段(read-onlyRO)就是代碼段,讀寫段(read-writeRW)是已經初始化的全局變量,而零初始化段(zero-initializedsectionZI)中存放未初始化的全局變量。五、嵌入式實時操作系統的移植初始化C環境(2)C環境初始化,就是利用上述符號初始化RW和ZI段以使后面使用的全局變量的C程序正常運行。這里有兩個循環,第一個循環把預初始化的數據段(位于代碼段的后面)復制到RAM中,另一個循環把未初始化的數據段ZI初始化為0,也就是實現把從ROM中的.data段復制到RAM,對ZI段內的數據初始化為0,以完成對C環境的初始化。五、嵌入式實時操作系統的移植ROM地址的重映射(remap)0x0200(bootcode)0x0100(Reset_handler)……BReset_Handler0x0000Flash(remap)0x0204(bootcode)0x0200(Reset_handler)BReset_Handler0x0000RAM五、嵌入式實時操作系統的移植初始化C環境(3)五、嵌入式實時操作系統的移植七、呼叫C程序對main函數的調用進入μC/OS的入口,通過這個入口就進入μC/OS的主函數,啟動對μC/OS的初始化。例
IMPORTMainbMain;CEntry五、嵌入式實時操作系統的移植μC/OS系統的初始化完成了前面的硬件初始化和運行環境的相關設置后,進入Main(),Main()是μC/OS的入口函數,啟動對μC/OS的初始化。五、嵌入式實時操作系統的移植ARM7的硬件抽象層——uHALμC/OSARM公司為操作系統的開發提供了一個硬件抽象層HAL,稱為uHAL。從結構上看,uHAL是一組庫程序,需要說明的是,uHAL并不是專門為μC/OS準備的,甚至也不是專為操作系統內核準備的。uHAL只是個針對ARM核的函數庫。μC/OS是建立在uHAL的基礎之上的。五、嵌入式實時操作系統的移植μC/OS系統的初始化(2)五、嵌入式實時操作系統的移植ARMTargetInit()函數結構ARMTargetInit()調uHAL打印接口打印系統信息調用uHAL函數禁止所有中斷調用uHAL函數對中斷初始化uHAL函數對ARM計數器初始化結束五、嵌入式實時操作系統的移植uHAL的功能uHAL的作用之一是在操作系統本身進入正常運行之前,為系統提供基本的輸入輸出手段,例如uHALr_printf()等。uHAL還要為操作系統的運行準備一個基本的運行環境,具體包括下列各種初始化:通過uHAL_ResetMMU(),將MMU設置在一個確定的初始狀態。通過ARMDisable()關閉中斷。通過uHAL_InitInterrupts()設置中斷向量處理程序。通過uHAL_InitTimer()對系統使用的計數器進行初始化。五、嵌入式實時操作系統的移植ARMTargetStart()的分析
創建了任務之后,ARMTargetStart()調用uHALr_InstallSystemTimer()創建一個系統時鐘,為時鐘中斷做好準備。五、嵌入式實時操作系統的移植提要12嵌入式系統的初始化C/OS-Ⅱ移植分析五、嵌入式實時操作系統的移植操作系統移植的概念所謂操作系統的移植,是指使一個實時操作系統能夠在某個微處理器平臺上運行。
COS-II的主要代碼都是由標準的C語言寫成的,移植方便。移植的主要工作是修改部分與處理器硬件相關的代碼。五、嵌入式實時操作系統的移植移植的層次操作系統的移植大體可以分為兩個層次:跨體系結構的移植。針對特定處理器的移植。五、嵌入式實時操作系統的移植移植
COS-II滿足的條件處理器的C編譯器能產生可重入代碼。在程序中可以打開或者關閉中斷。處理器支持中斷,并且能產生定時中斷(通常在10-100Hz之間)。處理器支持能夠容納一定量數據的硬件堆棧。處理器有將堆棧指針和其他CPU寄存器存儲和讀出到堆棧(或者內存)的指令。
五、嵌入式實時操作系統的移植什么是可重入代碼可重入的代碼指的是一段代碼(比如:一個函數)可以被多個任務同時調用,而不必擔心會破壞數據。也就是說,可重入型函數在任何時候都可以被中斷執行,過一段時間以后又可以繼續運行,而不會因為在函數中斷的時候被其他的任務重新調用,影響函數中的數據。五、嵌入式實時操作系統的移植可重入代碼舉例
程序1:可重入型函數
voids*x,int*y) { inttemp; temp=*x; *x=*y; *y=temp; }五、嵌入式實時操作系統的移植非可重入代碼舉例程序2:非可重入型函數
inttemp; voids*x,int*y) { temp=*x; *x=*y; *y=temp; }返回五、嵌入式實時操作系統的移植不可重入函數被中斷破壞五、嵌入式實時操作系統的移植如何使函數具有可重入性使Swap()函數具有可重入性:把Temp定義為局部變量。調用Swap()函數之前關中斷,調動后再開中斷。用信號量禁止該函數在使用過程中被再次調用。五、嵌入式實時操作系統的移植打開/關閉中斷在
COS-II中,可以通過:OS_ENTER_CRITICAL()OS_EXIT_CRITICAL()宏來控制系統關閉或者打開中斷。這需要處理器的支持。在ARM7TDMI的處理器上,可以設置相應的寄存器來關閉或者打開系統的所有中斷。五、嵌入式實時操作系統的移植處理器支持中斷并且能產生定時中斷
COS-II是通過處理器產生的定時器的中斷來實現多任務之間的調度的。ARM7TDMI的處理器上可以產生定時器中斷。五、嵌入式實時操作系統的移植處理器支持硬件堆棧
COS-II進行任務調度的時候,會把當前任務的CPU寄存器存放到此任務的堆棧中,然后,再從另一個任務的堆棧中恢復原來的工作寄存器,繼續運行另一個任務。所以,寄存器的入棧和出棧是
COS-II多任務調度的基礎。ARM7處理器中有專門的指令處理堆棧,可以靈活的使用堆棧。五、嵌入式實時操作系統的移植移植對開發工具的要求移植COS-II需要一個標準的C交叉編譯器。
由于移植時需要對CPU的寄存器進行操作,所以需要C交叉編譯器能夠支持匯編語言程序。嵌入式C編譯器一般都包括匯編器、鏈接器和定位器。鏈接器是用來將不同的模塊(編譯或匯編過的文件)鏈接成目標文件;定位器則允許將代碼和數據放置在目標處理器的指定內存空間中。五、嵌入式實時操作系統的移植移植μC/OS-II要點(1)開關中斷的方式。推薦使用method3{#ifOS_CRITICAL_METHOD==3 OS_CPU_SRcpu_sr;#endif… OS_ENTER_CRITICAL();… OS_EXIT_CRITICAL();}五、嵌入式實時操作系統的移植使用method3方式的開關中斷#defineOS_ENTER_CRITICAL() {cpu_sr=INTS_OFF();}#defineOS_EXIT_CRITICAL() {if(cpu_sr==0)INTS_ON();}五、嵌入式實時操作系統的移植ARM的中斷模式設備的中斷在ARM中被映射到了兩個異常中斷中——FIQ和IRQ。通過控制CPSR中的對應數據位,可以開啟或者關閉中斷。為了方便和統一μC/OS-II系統中斷的處理,只使用了IRQ模式的中斷。五、嵌入式實時操作系統的移植移植μC/OS-II要點(2)——系統中斷的處理
所有中斷的調用都需要經過系統的接管。中斷處理函數調用前后需要通知系統。例如:
OSIntEnter(); yourInterruptFun(); OSIntExit();五、嵌入式實時操作系統的移植OSIntExit的意義五、嵌入式實時操作系統的移植ARM的工作模式ARM處理器有7種操作模式:用戶模式(usr)
正常的程序執行模式。快速中斷模式(fiq)
支持高速數據傳輸或通道處理。中斷模式(irq)
用于通用中斷處理。管理員模式(svc)
操作系統的保護模式。中止模式(abt)
支持虛擬內存和/或內存保護等異常。系統模式(sys)
支持操作系統的特殊用戶模式(運行操作系統任務)。未定義模式(und)
支持硬件協處理器的軟件仿真。
除了用戶模式外,其他模式均可視為特權模式五、嵌入式實時操作系統的移植ARM的寄存器(1)37個寄存器:31個通用32位寄存器,包括程序計數器PC。6個狀態寄存器。15個通用寄存器
(R0toR14),以及2個狀態寄存器和程序計數器(PC)在任何時候都中可見的。可見的寄存器取決于處理器的模式,不同的模式映射了不同的工作寄存器。五、嵌入式實時操作系統的移植ARM寄存器的組織注:表明用戶或系統模式使用的正常寄存器已經被異常模式指定的另一個寄存器取代五、嵌入式實時操作系統的移植ARM的寄存器(2)R0到
R15可以直接訪問。R0到
R14是通用寄存器。R13:堆棧指針
(sp)(通常)。每種處理器模式都有單獨的堆棧。R14:鏈接寄存器(lr)。R15:程序計數器
(PC)。CPSR:當前程序狀態寄存器,包括代碼標志狀態和當前模式位。5個SPSR(程序狀態保存寄存器):當異常發生時保存CPSR狀態。五、嵌入式實時操作系統的移植μC/OS-II在ARM上的任務切換任務級的任務切換;中斷級的任務切換。五、嵌入式實時操作系統的移植中斷處理過程五、嵌入式實時操作系統的移植OSIntExit()voidOSIntExit(void){OS_ENTER_CRITICAL(); (1)if((--OSIntNesting|OSLockNesting)==0){(2)OSIntExitY=OSUnMapTbl[OSRdyGrp];(3)OSPrioHighRdy=(INT8U)((OSIntExitY<<3)+OSUnMapTbl[OSRdyTbl[OSIntExitY]]);if(OSPrioHighRdy!=OSPrioCur){OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];OSCtxSwCtr++;OSIntCtxSw(); (4)}}OS_EXIT_CRITICAL();}五、嵌入式實時操作系統的移植OSIntExit的關鍵——OSIntCtxSw實現中斷級的任務切換ARM在棧指針調整過程中的優勢五、嵌入式實時操作系統的移植移植μC/OS-II要點(3)——Thumb帶來的問題很多ARM內核集成了16位thumb指令集。Thumb可以在一定程度上節省代碼空間,提高系統效率。Thumb會給中斷級的任務切換帶來麻煩。CPSR中的T位不能直接操作。Thumb狀態將導致CPSR恢復以后的指令不能運行。解決辦法:對Thumb的使用必須保證原子操作。專門對任務切換中Thumb的情況作處理。建議,小心使用C編譯器,盡量不使用Thumb。五、嵌入式實時操作系統的移植移植μC/OS-II的要點(4)—何時啟動系統定時器如果在OSStart之前啟動定時器,則系統可能無法正確執行完OSStartHighRdy。OSStart函數直接調用OSStartHighRdy去執行最高優先級的任務,OSStart不返回。系統定時器應該在系統的最高優先級任務中啟動。使用OSRunning變量來控制操作系統的運行。在我們的移植版本中,使用了μC/OS-II中的保留任務1作為系統任務,負責啟動定時器。五、嵌入式實時操作系統的移植例:C/OS-II在S3C44B0X上的移植設置OS_CPU.H中與處理器和編譯器相關的代碼。用C語言編寫六個操作系統相關的函數(OS_CPU_C.C)。用匯編語言編寫四個與處理器相關的函數(OS_CPU.ASM)。五、嵌入式實時操作系統的移植設置與處理器和編譯器相關的代碼OS_CPU.H中定義了與編譯器相關的數據類型。比如:INT8U、INT8S等。與ARM處理器相關的代碼,使用OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()宏開啟/關閉中斷。設置堆棧的增長方向:堆棧由高地址向低地址增長。五、嵌入式實時操作系統的移植設置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 /*從高向低*/五、嵌入式實時操作系統的移植程序狀態寄存器
條件位:N=1-結果為負,0-結果為正或0Z=1-結果為0,0-結果不為0C=1-進位,0-借位V=1-結果溢出,0結果沒溢出Q位:僅ARM5TE/J架構支持指示增強型DSP指令是否溢出J位僅ARM5TE/J架構支持J=1:處理器處于Jazelle狀態中斷禁止位:I=1:禁止IRQF=1:禁止FIQTBit僅ARMxT架構支持T=0:處理器處于ARM狀態T=1:處理器處于Thumb狀態Mode位(處理器模式位):0b10000 User0b10001 FIQ0b10010 IRQ0b10011 Supervisor0b10111 Abort0b11011 Undefined0b11111 System2731NZCVQ2867IFTmode1623
815
54024fsxc
UndefinedJ五、嵌入式實時操作系統的移植打開/關閉中斷 EXPORTINTS_OFF EXPORTINTS_ONINTS_OFFmrsr0,cpsr;currentCSRmovr1,r0;makeacopyformaskingorrr1,r1,#0xC0;maskoffintbitsmsrCPSR_cxsf,r1;disableintsandr0,r0,#0x80;returnIRQbitmovpc,lr;returnINTS_ONmrsr0,cpsr;currentCSRbicr0,r0,#0x80;maskonintsmsrCPSR_cxsf,r0;enableintsmovpc,lr;return…110000007031…100000007031…IFTMode7031五、嵌入式實時操作系統的移植設置OS_STK_GROWTH絕大多數的微處理器和微控制器的堆棧是從上往下長的。但是某些處理器是用另外一種方式工作的。
C/OS-Ⅱ被設計成兩種情況都可以處理,只要在結構常量OS_STK_GROWTH中指定堆棧的生長方式就可以了。置OS_STK_GROWTH為0表示堆棧從下往上長。置OS_STK_GROWTH為1表示堆棧從上往下長。五、嵌入式實時操作系統的移植用C語言編寫六個操作系統相關的函數void*OSTaskStkInit(void(*task)(void*pd),void*pdata,void*ptos,INT16Uopt)voidOSTaskCreateHook(OS_TCB*ptcb)voidOSTaskDelHook(OS_TCB*ptcb)voidOSTaskSwHook(void)voidOSTaskStatHook(void)voidOSTimeTickHook(void)后5個函數為接口函數,可以不加代碼。五、嵌入式實時操作系統的移植OSTaskStkInitOSTaskCreate()和OSTaskCreateExt()通過調用OSTaskStkInit()來初始化任務的堆棧結構。因此堆棧看起來就像剛發生過中斷并將所有的寄存器保存到堆棧中的情形一樣。這里我們定義了堆棧是從上往下長的。在用戶建立任務時,用戶傳遞任務的地址、pdata指針、任務的堆棧棧頂和任務的優先級給OSTaskCreate()和OSTaskCreateExt()。一旦用戶初始化了堆棧,OSTaskStkInit()就需要返回堆棧指針所指的地址。OSTaskCreate()和OSTaskCreateExt()會獲得該地址并將它保存到任務控制塊(OS_TCB)中。五、嵌入式實時操作系統的移植堆棧初始化低地址內存存儲的處理器寄存器值中斷返回地址處理器狀態字任務起始地址pdata高地址內存堆棧指針堆棧增長方向五、嵌入式實時操作系統的移植ARM系統的堆棧初始化堆棧指針SP堆棧增長方向低端內存備份程序狀態寄存器SPSR當前程序狀態寄存器CPSR任務傳遞參數R0(pdata)R1……R11R12中斷返回地址LR任務起始地址ptos(PC)高端內存五、嵌入式實時操作系統的移植OSTaskStkInitOS_STK*OSTaskStkInit(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT16Uopt){unsignedint*stk;stk=(unsignedint*)ptos;/*Loadstackpointer*///USE_ARG(opt);opt++;/*buildastackforthenewtask*/*--stk=(unsignedint)task;/*pc*/*--stk=(unsignedint)task;/*lr*/*--stk=12;/*r12*/*--stk=11;/*r11*/*--stk=10;/*r10*/*--stk=9;/*r9*/*--stk=8;/*r8*/*--stk=7;/*r7*/*--stk=6;/*r6*/*--stk=5;/*r5*/*--stk=4;/*r4*/*--stk=3;/*r3*/*--stk=2;/*r2*/*--stk=1;/*r1*/*--stk=(unsignedint)pdata;/*r0*/*--stk=(SUPMODE); /*cpsr*/*--stk=(SUPMODE); /*spsr*/return((OS_STK*)stk);}五、嵌入式實時操作系統的移植OSTaskCreateHook當用OSTaskCreate()和OSTaskCreateExt()建立任務的時候就會調用OSTaskCreateHook()。該函數允許用戶或使用移植實例的用戶擴展
C/OS-Ⅱ功能。當
C/OS-Ⅱ設置完了自己的內部結構后,會在調用任務調度程序之前調用OSTaskCreateHook()。該函數被調用的時候中斷是禁止的。因此用戶應盡量減少該函數中的代碼以縮短中斷的響應時間。當OSTaskCreateHook()被調用的時候,它會收到指向已建立任務的OS_TCB的指針,這樣它就可以訪問所有的結構成員了。函數原型:voidOSTaskCreateHook(OS_TCB*ptcb){ptcb=ptcb;}五、嵌入式實時操作系統的移植OSTaskDelHook
當任務被刪除的時候,就會調用OSTaskDelHook()函數。該函數在把任務從
C/OS-Ⅱ的內部任務鏈表中刪除之前被調用。當該函數被調用的時候,它會收到指向正被刪除任務的OS_TCB的指針,這樣它就可以訪問所有的結構成員了。OSTaskDelHook()可以來檢驗TCB擴展是否被建立(一個非空指針),并進行一些清除操作。函數原型:voidOSTaskDelHook(OS_TCB*ptcb){ptcb=ptcb;}五、嵌入式實時操作系統的移植OSTaskSwHook當發生任務切換的時候就會調用OSTaskSwHook()。OSTaskSwHook()可以直接訪問OSTCBCur和OSTCBHighRdy,因為它們是全局變量。OSTCBCur指向被切換出去的任務OS_TCB,而OSTCBHighRdy指向新任務OS_TCB。注意在調用OSTaskSwHook()期間中斷一直是被禁止的。因此用戶應盡量減少該函數中的代碼以縮短中斷的響應時間。函數原型:voidOSTaskSwHook(void){#if0if(OSRunning==TRUE){/*保存擬被掛起任務的寄存器;
}/*恢復擬被運行任務的寄存器;
#endif}五、嵌入式實時操作系統的移植OSTaskStatHookOSTaskStatHook()每秒鐘都會被OSTaskStat()調用一次。用戶可以用OSTaskStatHook()來擴展統計功能。例如,用戶可以保持并顯示每個任務的執行時間,每個任務所用的CPU份額,以及每個任務執行的頻率等。函數原型:voidOSTaskStatHook(void)五、嵌入式實時操作系統的移植OSTimeTickHookOSTimeTickHook()在每個時鐘節拍都會被OSTaskTick()調用。實際上,OSTimeTickHook()是在節拍被
C/OS-Ⅱ真正處理,并通知用戶的移植實例或應用程序之前被調用的。函數原型:voidOSTimeTickHook(void)五、嵌入式實時操作系統的移植用匯編語言編寫四個
與處理器相關的函數OSStartHighRdy()OSCtxSw()OSIntCtxSw()OSTickISR()五、嵌入式實時操作系統的移植OSStartHighRdy():運行優先級最高的就緒任務
OSStartHighRdy LDR r4,addr_OSTCBCur ;得到當前任務TCB地址
LDR r5,addr_OSTCBHighRdy ;得到最高優先級任務TCB地址
LDR r5,[r5] ;獲得堆棧指針
LDR sp,[r5] ;轉移到新的堆棧中
STR r5,[r4] ;設置新的當前任務TCB地址
LDMFD sp!,{r4} ; MSR SPSR,r4 LDMFD sp!,{r4} ;從棧頂獲得新的狀態
MSR CPSR,r4 ;CPSR處于SVC32Mode摸式
LDMFD sp!,{r0-r12,lr,pc} ;運行新的任務五、嵌入式實時操作系統的移植OSCtxSw()的原型
voidOSCtxSw(void){
保存處理器寄存器;
將當前任務的堆棧指針保存到當前任務的OS_TCB中:OSTCBCur->OSTCBStkPtr=Stackpointer;
調用用戶定義的OSTaskSwHook();OSTCBCur=OSTCBHighRdy;OSPrioCur=OSPrioHighRdy;
得到需要恢復的任務的堆棧指針:Stackpointer=OSTCBHighRdy->OSTCBStkPtr;
將所有處理器寄存器從新任務的堆棧中恢復出來;
執行中斷返回指令;}五、嵌入式實時操作系統的移植OS_TASK_SW();任務級的任務切換函數(1)
OS_TASK_SW STMFD sp!,{lr} ;保存pc STMFD sp!,{lr} ;保存lr STMFD sp!,{r0-r12} ;保存寄存器和返回地址
MRS r4,CPSR STMFD sp!,{r4} ;保存當前的PSR MRS r4,SPSR STMFD sp!,{r4} ;保存SPSR ;OSPrioCur=OSPrioHighRdy LDR r4,addr_OSPrioCur LDR r5,addr_OSPrioHighRdy
LDRB r6,[r5] STRB r6,[r4]
五、嵌入式實時操作系統的移植OS_TASK_SW():任務級的任務切換函數(2)
;得到當前任務TCB地址
LDR r4,addr_OSTCBCur LDR r5,[r4] STR sp,[r5] ;保存sp在被占先的任務的TCB ;得到最高優先級任務TCB地址
LDR r6,addr_OSTCBHighRdy LDR r6,[r6] LDR sp,[r6] ;得到新任務堆棧指針
;OSTCBCur=OSTCBHighRdy STR r6,[r4] ;設置新的當前任務的TCB地址
;保存任務方式寄存器
LDMFD sp!,{r4} MSR SPSR,r4 LDMFD sp!,{r4} MSR CPSR,r4;返回到新任務的上下文
LDMFD sp!,{r0-r12,lr,pc}五、嵌入式實時操作系統的移植中斷服務五、嵌入式實時操作系統的移植關于棧指針調整五、嵌入式實時操作系統的移植棧指針調整
調整堆棧指針(加一個數在堆棧指針上)來完成的。加在堆棧指針上的數必須是明確的,而這個數主要依賴于移植的目標處理器(地址空間可能是16,32或64位),所用的編譯器,編譯器選項,內存模式等等。另外,處理器狀態字可能是8,16,32甚至64位寬,并且OSIntExit()可能會分配局部變量。有些處理器允許用戶直接增加常量到堆棧指針中,而有些則不允許。在后一種情況下,可以通過簡單的執行一定數量的pop(出棧)指令來實現相同的功能。一旦堆棧指針完成調整,新的堆棧指針會被保存到被切換出去的任務的OS_TCB中。五、嵌入式實時操作系統的移植OSIntCtxSW的實現五、嵌入式實時操作系統的移植OSIntCtxSw()的原型
voidOSIntCtxSw(void){
調整堆棧指針來去掉在調用:OSIntExit(),OSIntCtxSw()過程中壓入堆棧的多余內容;
將當前任務堆棧指針保存到當前任務的OS_TCB中:OSTCBCur->OSTCBStkPtr=堆棧指針;
調用用戶定義的OSTaskSwHook();OSTCBCur=OSTCBHighRdy;OSPrioCur=OSPrioHighRdy;
得到需要恢復的任務的堆棧指針:
堆棧指針=OSTCBHighRdy->OSTCBStkPtr;
將所有處理器寄存器從新任務的堆棧中恢復出來;
執行中斷返回指令;}五、嵌入式實時操作系統的移植OSIntCtxSW();中斷級的任務切換函數(1)
OSIntCtxSwaddr7,sp,#16;保存寄存器指針LDR sp,=IRQStack ;FIQ_STACKmrsr1,SPSR;得到暫停的PSRorrr1,r1,#0xC0;關閉IRQ,FIQ.msrCPSR_cxsf,r1;轉換模式(應該是SVC_MODE)ldrr0,[r7,#52];從IRQ堆棧中得到IRQ'sLR(任務PC)subr0,r0,#4;當前PC地址是(saved_LR-4)STMFD sp!,{r0} ;保存任務PCSTMFD sp!,{lr} ;保存LRmovlr,r7;保存FIQ堆棧ptrinLR(轉到nuker7)ldmfdlr!,{r0-r12};從FIQ堆棧中得到保存的寄存器STMFD sp!,{r0-r12} ;在任務堆棧中保存寄存器 五、嵌入式實時操作系統的移植OSIntCtxSW();中斷級的任務切換函數(2)
;在任務堆棧上保存PSR和任務PSRMRS r4,CPSRbicr4,r4,#0xC0;使中斷位處于使能態STMFD sp!,{r4} ;保存任務當前PSRMRS r4,SPSRSTMFD sp!,{r4} ;SPSR;OSPrioCur=OSPrioHighRdy//改變當前程序LDR r4,addr_OSPrioCurLDR r5,addr_OSPrioHighRdyLDRB r6,[r5]STRB r6,[r4];得到被占先的任務TCBLDR r4,addr_OSTCBCurLDR r5,[r4]STR sp,[r5] ;保存sp在被占先的任務的TCB五、嵌入式實時操作系統的移植OSIntCtxSW();中斷級的任務切換函數(3)
;得到新任務TCB地址LDR r6,addr_OSTCBHighRdyLDR r6,[r6]LDR sp,[r6] ;得到新任務堆棧指針
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 自愿替班協議書范本
- 看管水庫協議書范本
- 建設扶貧車間協議書
- 研發項目立項協議書
- 藥品寄存協議書模板
- 委托承辦會議協議書
- 重慶大足法院協議書
- 租房鋪面出租協議書
- 美國買房協議書樣本
- 紙質股票轉讓協議書
- 縱隔惡性腫瘤護理查房
- 山東省煙臺市芝罘區(五四制)2022-2023學年七年級下學期期中考試英語試題及答案
- 2024年貴州省交通運輸廳所屬事業單位招聘考試真題
- 固定資產管理制度實施細則
- 突發性聾診療指南
- 國家開放大學《課程與教學論》形考任務1-4參考答案
- 放棄治療同意書
- USP 1225檢驗方法驗證和USP1226檢驗方法確認(中英文稿)
- 膽道射頻消融技術PPT課件
- 水力機械輔助設備安裝質量評定表及填表說明
- 機械制圖 點的投影 公開課PPT學習教案
評論
0/150
提交評論