




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
開發(fā)stm32。Libraries包含庫的源代碼,Projectstm32各個外設(shè)的使用范例和一 既然準(zhǔn)備使用32位單片機,應(yīng)該是個不小項目,因此工程 結(jié)構(gòu)。假設(shè)工程名字叫temte,建一個名為temte的文件夾,該 下有個3個固定文件夾doc,src,include,doc用來存和list。由于Libraries下的CMSIS文件夾中很多代碼是和編譯器及相關(guān)的,導(dǎo)致Libraries\STM32F10x_StdPeriph_Driver\下的內(nèi)容拷貝到下在 Libraries\CMSIS\CM3\CoreSupport\下的core_cm3.c,core_cm3.h;system_stm32f10x.c,system_stm32f10x.h拷貝到cmsis文件夾中。文件拷貝到cmsis文件夾中。這里我拷貝的是startup_stm32f10x_hd.s(大容量型stm32的啟動文件)。Libraries\CMSIS下是什么呢?cmsis英文全稱:CortexMicrocontrollercore_cm3.c,它們的CoreSupportCM3內(nèi)核支撐文件,其他使stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h和startup_stm32f10x_hd.s在DeviceSupport system_stm32f10x.h這兩個文件提供函數(shù)用來初始化stm32,配置PLL、系統(tǒng)時鐘和內(nèi)置flash接口。startup_stm32f10x_hd.s是大容量型stm32的啟動使用keilMDK(我使用4.12版)在temte 程文件夾時要選No,因為標(biāo)準(zhǔn)外設(shè)已經(jīng)有啟動代碼了。將UV4中projectwindow里的頂層名改為temte,并將第一個名改為libstm32。把libstm32 下所有.c和.s文件加載到工程里的libstm32。在src下建立一個init 中,stm32f10x_it.h,stm32f10x_conf.h拷貝到include文件夾中。stm32f10x_it.c,stm32f10x_it.h是中斷服務(wù)程序文件。stm32f10x_conf.h是標(biāo)事實上,stm32標(biāo)準(zhǔn)外設(shè)庫的使用在stm32f10x_stdperiph_lib_um.中認(rèn)SYSCLK_FREQ_72MHz注釋已去掉,如果你的主頻是72MHz,就不用做修改了,這里我的是36MHz,注釋SYSCLK_FREQ_72MHz,去掉SYSCLK_FREQ_36MHz注釋。在init 下建立main.c作為系統(tǒng)。在src下建立一個bsp #ifndef_LED_H_#define#include<stdint.h>#define #define #define voidled_init(void);voidled_on(uint32_tn);#include"led.h"voidled_init(void)GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;GPIO_Init(GPIOC,&GPIO_InitStructure);}voidled_on(uint32_t{switch(n)casecasecase}}n){switch(n){casecasecase}}#includestaticvoidms){uint32_tcount=8000;while(ms--){count=8000;}}intfor(;;){}}IncludePaths中添加.\include;.\src\libstm32\cmsis;.\src\libstm32\inc;雖然目前網(wǎng)上已經(jīng)有不少關(guān)于ucosiistm32micrium也了解。1.目標(biāo);2.ucosii內(nèi)核原理。雖然我們移植的目標(biāo)是stm32,但操作系統(tǒng)的移植基本是針對Cortex-M3就是CM3內(nèi)核加上各種各樣的外設(shè)。章節(jié)還不到100頁,就這點內(nèi)容,總要看了吧。2.1-Cortex-M3的概貌。剛開始看時不用追求全部理解,后面會有詳細(xì)介2.8指令集,只要了解,CM3thumb2就ok了。R0-R12:R13:有兩個,MSPPSP,同時只能看見一個R13時,的是正在使用的那個MSP:可用于異常服務(wù)和應(yīng)用程序PSP:R14:連接寄存器,又名LR,返回地R15:應(yīng)用程序PSR(APSR)執(zhí)行PSR(EPSR)每個都是32位,由于這3個寄存器有效位是錯開的,因此可以組合。操作模式處理者模式和線程模式-3.8 PCchapter7NVIC中,每個中斷都有一個優(yōu)先級配置寄存器(1byte),用來配置該亞優(yōu)先級。此時所有中斷有8個搶占優(yōu)先級,每個搶占優(yōu)先級有2個亞優(yōu)先級。參考附錄D.90xE000_E400-0xE000_E4EF240個。D.160xE000_ED180xE000_ED2312個。 是用在大型的操作系統(tǒng)上,如linuxCM3MMU,應(yīng)該是無法過還是很懷疑有人會在像stm32這種上用uclinux。寫)PendSV中斷優(yōu)先級必須設(shè)為最低。NVIC負(fù)責(zé)的中斷管理,它和CM3內(nèi)核緊密相關(guān)chapter9xPSRPCLRR12R3‐R0計數(shù)器PC對移植ucosii別返回動作的。因為EXC_RETURN是一個特殊值,所以對于CM3,匯編語言就不需要類似數(shù)為中斷服務(wù)程序。實際上,中斷服務(wù)程序如果是c代碼編寫,匯編成匯編代碼,函數(shù)結(jié)尾一般是reti。9.49.69.710.2C的接口個,R1傳遞第2個……在返回時,把返回值寫到R0中。則必須先PUSH,后POP。和代碼組成。ucosii最經(jīng)典的學(xué)習(xí)資料莫過于老師的<<嵌入式實時操作系統(tǒng)uc/os-ii(第2版)>>,這本書對學(xué)ucosii已經(jīng)足夠了,因為他把ucosiiV2.55代總是切換到就緒的最高優(yōu)先級任務(wù)。有2種情況會發(fā)生任務(wù)切換。需要注意的是SysTick中斷,這個中斷是os的“心跳”,必須得有。這樣就使得斷中必須做的工作僅有os的時間管理。也就是調(diào)用OSTimeTick()。程經(jīng)驗的話,應(yīng)該很好理解。無非是任務(wù)Acpu使用高,則任務(wù)A繼續(xù)執(zhí)行。具體怎么實現(xiàn)就看邵老師的書吧。下面看看ucosii代碼組成: osmutex.c os_mem.c 定時器管理代碼,這部分代碼時從V2.81版才開始有的,邵老師的書講的是V2.55版的代碼,是沒有這部分內(nèi)容的。如果前面的代碼都理解的話,這部分代碼的定時還是只做一次定時。如果用戶使能了OS_TMR_EN,ucosii會在內(nèi)部創(chuàng)建一 定義一些用戶hook 本,V2.85有問題)。 為這個文件對ucosii在CM3內(nèi)核移植過程中需要修改的代碼進(jìn)行了說明。EvalBoards:micrium評估板相關(guān)代uc-LIB:micrium的一個庫代uC-Probe:uC-Probe這里請大家其中模板代碼(),本文把Micrium\Software\uCOS-II\Ports\ARM-Cortex-M3\Generic\RealView下的文ucosii\src下的代碼是ucosii敗,可以把ucosii\src下的代碼文件設(shè)為只讀。 OSCPU#defineOS_CPU_EXT#defineOSCPUEXTexterntypedefunsignedcharBOOLEAN;typedefunsignedcharINT8U;typedefsignedcharINT8S;typedefunsignedshortINT16U;typedefsignedshortINT16S;typedefunsignedintINT32U;typedefsignedintINT32S;typedeffloatFP32;typedefdoubletypedefunsignedintOSSTK;typedefunsignedintOS_CPU_SR;CM3的狀態(tài)寄存器(xPSR)32位寬的,因此OS_CPU_SR被類型重定義為unsignedint。OS_CPU_SROS_CRITICAL_METHOD3中保存cpu狀態(tài)寄存器用的。在CM3中,移植OS_ENTER_CRITICAL(),OS_EXIT_CRITICAL()選方法3是最合適的。#define #ifOSCRITICALMETHOD==#defineOS_ENTER_CRITICAL(){cpu_sr=OS_CPU_SR_Save();}#defineOS_EXIT_CRITICAL() os_cpu_a.asm中,到時再解釋。#define #defineOSTASKSW()OSCtxSw()#ifOSCRITICALMETHOD==OS_CPU_SR OSCPUSysTickHandler(void); OS_CPU_SysTickHandler()定義在os_cpu_c.cSysTick中斷的中斷處也就不需要了,是不是很奇怪移植版為什么會這樣弄吧,后面我會解釋的。依賴于OS_CPU_SysTickClkFreq(),而此函數(shù)我們自己會實現(xiàn),所以注釋掉。而本文移植中并未用到BSP.C,后面我們會自己實現(xiàn),因此可以把它注釋掉。oscpuucosii10個相當(dāng)簡單的C下面就說一說OSTaskStkInit()。說之前還是得先說一下任務(wù)切換,因為初始化生時,原來函數(shù)執(zhí)行的地方(程序計數(shù)器PC、處理器狀態(tài)寄存器及所有通用寄存保存的原來函數(shù)執(zhí)行的信息恢復(fù)即可(把棧中保存的代碼現(xiàn)場重新賦給cpu的各個3foo1()foo2(),foo3()該任務(wù)好像剛被中斷一樣的假象。(關(guān)于任務(wù)切換的原理邵老師3.06節(jié)有介那么中斷后棧中是個什么情形呢,<<ARMCortex-M3指南>>中9.1.1有寄存器。這些值里R1-R12都沒什么意義,這里用相應(yīng)的數(shù)字代號(如R1用 xPSR=0x L,xPSRT位(24位)1,否則第一次執(zhí)行任務(wù)時R14=0xFFFFFFFEL,最低4位為E,是一個值,主要目的是不讓使R0用于傳遞任務(wù)函數(shù)的參數(shù),因此等于p_argOS_STK*OSTaskStkInit(void(*task)(void*p_arg),void*p_arg,*ptos,INT16U{OSSTK /*'opt'isnotused,preventwarning*/ =ptos; /*Loadstackpointer /*Registersstackedasifauto-savedonexception = L;/* *(--stk)= /*EntryPoint/*R14(LR)(initvaluewillcausefaultifever*(--stk)=*(--stk)= L;/*R12*(--stk)= L;/*R3*(--stk)= L;/*R2*(--stk)= L;/*R1*(--stk)=(INT32U)p /*R0:argument/*Remainingregisterssavedonprocessstack*(--stk)= L;/*R11*(--stk)= L;/*R10*(--stk)= L;/*R9*(--stk)= L;/*R8*(--stk)= L;/*R7*(--stk)= L;/*R6*(--stk)= L;/*R5*(--stk)=(INT32U)0x L;/*R4*/return(stk);}),#defineOS_CPU_CM3_NVIC_ST_CTRL(*((volatileINT32U*)0xE000E010))#defineOS_CPU_CM3_NVIC_ST_RELOAD(*((volatileINT32U#defineOS_CPU_CM3_NVIC_ST_CURRENT(*((volatile#defineOSCPUCM3NVICSTCAL(*((volatileINT32U*)0xE000E01C))#defineOS_CPU_CM3_NVIC_ST_CTRL_COUNT #defineOSCPUCM3NVICSTCTRL #define EXTERNOSRunning EXTERNOSPrioCurEXTERNOSPrioHighRdyEXTERNOSTCBCurEXTERNOSTCBHighRdyEXTERNOSIntNestingEXTERNOSIntExitEXTERNOSTaskSwHookEXPORTOS_CPU_SR_Save ;FunctionsdeclaredinthisfileEXPORTOS_CPU_SR_RestoreEXPORTOSStartHighRdyEXPORTOSCtxSwEXPORTEXPORTOSCPU ;28定義幾個常量,類似C語言中的#defineOSCPUSR R0, ;PRIMASK到R0中,R0為返回 PRIMASK, ;R0到PRIMASK中,R0為參 R0, ;R0= R1,=NVICPENDSVPRI;R1=NVICPENDSVPRI R1,[R0];*(uint8_t*)NVIC_SYSPRI14=NVIC_PENDSV_PRI R0, ;R0= PSP, ;PSP= R0,=OSRunning R1,#1 ;R1=1 R1, ;OSRunning=;PendSV R0,=NVIC_INT_CTRL ;R0=NVIC_INT_CTRL R1,=NVIC_PENDSVSET R1,R0];*(uint32t*)NVICINTCTRLNVICPENDSVSET 這是第一次任務(wù)切換。做過切換后PSP就不會為0了,后面會看到。斷。這個<<ARMCortex-M3指南>>8.4.5其它異常的配置寄存器有說明。當(dāng)一個任務(wù)放棄cpu的使用權(quán),就會調(diào)用OS_TASK_SW()宏,而單的觸發(fā)PendSV中斷即可。OS_TASK_SW()是由OS_Sched()調(diào)用。voidOS_Sched{#ifOSCRITICALMETHOD==OS_CPU_SRcpu_sr=0;if(OSIntNesting==0)if(OSLockNesting=={if(OSPrioHighRdy!=OSPrioCur)#ifOS_TASK_PROFILE_EN>0}}
/*PendSV}} R0, ;R0= R1,=NVIC ;R1=NVIC R1,[R0] ;*(uint32_t*)NVIC_INT_CTRLNVIC_PENDSVSET 務(wù)需要執(zhí)行。如果有OSIntExit()對調(diào)用OSIntCtxSw()做任務(wù)切換。 R0,=NVIC_INT_CTRL R1,[R0] 這兩個函數(shù)的意義是不一樣的,OSCtxSw()A因為等待某個資源或是做延時切換到任務(wù)B,而OSIntCtxSw()則是中斷退出時,由中斷所以無需做第二次了(參考邵老師書的3.10節(jié))。這里只不過由于CM3的特殊機PendSVPendSV中斷中斷時會有一半的寄存器自動保存到任務(wù)堆棧里,所以在PendSV中斷處理函數(shù)中只需保存R4-R11并調(diào)節(jié)堆棧指針即可。{if(PSP!=NULL)SaveR4-R11ontotaskstack;}OSTCBCur=RestoreR4-R11fromnewtaskstack;Returnfromexception;} ;xPSRPCLRR12R0-R3 R0,PSP ;R0=PSP R0,OSCPUPendSVHandlerR0,R0,;R0-=R0,{R4- R1,=OSTCBCur ;R1=&OSTCBCur R1,[R1] ;R1=*R1(R1=OSTCBCur) R0, ;*R1=R0(*OSTCBCur=SP)PUSH{R14} LDRR0,=OSTaskSwHook;R0=&OSTaskSwHookBLXR0 ;調(diào)用OSTaskSwHook()POP{ ;OSPrioCur= R0, ;R0= R1,=OSPrioHighRdy ;R1=&OSPrioHighRdy R2,[R1] ;R2=*R1(R2=OSPrioHighRdy) R2, ;*R0=R2(OSPrioCur=;OSTCBCur= R0, ;R0= R1,=OSTCBHighRdy ;R1=&OSTCBHighRdy R2,[R1] ;R2=*R1(R2=OSTCBHighRdy) R2, ;*R0=R2(OSTCBCur= R0 ;R0*R2(R0OSTCBHighRdy),R0;SP=OSTCBHighRdy->OSTCBStkPtr R0,{R4-R11} R0,R0,#0x20 ;R0+=0x20 PSP LR,LR,#0x04 ;確保LR位2為1,返回后使用進(jìn)程堆棧#4 #2OSTCBStkPtr是任務(wù)控制塊結(jié)構(gòu)體的第一個變量,所以*OSTCBCurSP(不是很科學(xué))就是OSTCBCur->OSTCBStkPtr=SP;#3和#2LR位2必須為1。邵老師的書和<<ARMCortex-M3指南>>。3stm32f10x_it.cSysTick中斷函設(shè)庫CMSIS中提供的啟動文件,而移植的啟動文件卻是自己寫的,在兩個文件init.s,vectors.s中main(),vectors.s設(shè)置中斷向量。OS_CPU_SysTickHandler和OS_CPU_PendSVHandler就是在vectors.s中被設(shè)置的。CMSISstartup_stm32f10x_hd.s作為啟動文件的,那該怎么在這個文件中設(shè)置OS_CPU_SysTickHandler呢,事實上在startup_stm32f10x_hd.s文件中,PendSV中斷向量名為PendSV_Handler,所以只需用OS_CPU_PendSVHandler把所有出現(xiàn)PendSV_Handler的地方替換掉就可那么為什么OS_CPU_SysTickHandler不用這種方式處理呢,這樣也就不用注釋os_cpu.c中的OS_CPU_SysTickHandler(),這主要是基于兩個原因:如果保留OS_CPU_SysTickHandler(),在以后開發(fā)過程中,改動對于上面的原因1,一開始移植時,我曾做過在PendSV_Handler()中調(diào)用OS_CPU_PendSVHandler(),后來發(fā)現(xiàn)這樣不行,這是為什么呢?問題出在LR寄{} {r4,pc}的地址+1OS_CPU_PendSVHandlerORRLR,LR,#0x04就不會agh和ocfghhiie文件夾中創(chuàng)建一個空的gh_cfghiesTM320B-LR-oegh到m:#define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define 質(zhì)上來說就是一個定時器。先把原來
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 渝中區(qū)危險化品運輸合同6篇
- 2024屆高考語文專題復(fù)習(xí)彈琴三境界 寫作指導(dǎo)
- 餐廳窗口承包合同
- 2025年青海道路運輸從業(yè)人員資格考試內(nèi)容有哪些
- 公司和個人勞務(wù)合同
- 學(xué)校食堂檔口承包合同
- 會議邀請函模板表
- 公司財務(wù)管理規(guī)章制度的修訂與完善建議
- 企業(yè)高管聘用合同
- 農(nóng)田租地合同協(xié)議書
- 村民委員會組織法解讀(修改)課件
- 旅店會客登記制度
- 無人機校企合作方案
- 城市軌道交通員工職業(yè)素養(yǎng)(高職)全套教學(xué)課件
- 體系基礎(chǔ)知識培訓(xùn)
- 工程力學(xué)期末考試試卷A及答案
- 氣體充裝安全操作規(guī)程
- 同課異構(gòu)知識講座
- 設(shè)計08學(xué)四史守望精神家園-浙江省初中歷史法治學(xué)科項目化學(xué)習(xí)作業(yè)案例設(shè)計
- 【貴州茅臺公司股權(quán)激勵問題及優(yōu)化分析(10000字論文)】
- QC活動成果標(biāo)準(zhǔn)排列圖(帕累托圖)
評論
0/150
提交評論