<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > STM32移植uC/OS-II總結

STM32移植uC/OS-II總結

作者: 時(shí)間:2016-11-20 來(lái)源:網(wǎng)絡(luò ) 收藏
uC/OS-II成功移植STM32 上了,雖然理解還不是很深刻,但大體明白移植方法,以前曾經(jīng)將uC/OS-II移植到MSP430F1611上,但是也沒(méi)關(guān)注那么多,現在按照網(wǎng)友的介紹進(jìn)行移植,下載官方的V2.86版本的固件,自己建工程,修改Port部分,建立兩個(gè)任務(wù),但是調試時(shí)死在程序死在了OSStart();里。經(jīng)過(guò)單步發(fā)現程序的軟件中斷觸發(fā)后調用服務(wù)函數失敗,停在了

OSStartHang BOSStartHang //停在這里,而且這里正常情況下不應該在這的;

本文引用地址:http://dyxdggzs.com/article/201611/319066.htm

然后就開(kāi)始查問(wèn)題,最終解決。發(fā)現無(wú)論學(xué)什么,一定要知其然知其所以然,不然學(xué)的永遠都只是皮毛?,F在把自己的移植過(guò)程和理解記錄下來(lái)。

下載將官方的庫,Port部分是需要修改的部分,Source部分不用修改。

(1)OS_CPU.h文件下面定義類(lèi)型名稱(chēng),堆棧類(lèi)型OS_ENTER_CRITICAL(),OS_EXIT_CRITICAL()選方法3是最合適的;定義棧增長(cháng)方向,STM32是高地址向低地址增長(cháng)的,所以#define OS_STK_GROWTH 1 ;

另外再定義幾個(gè)函數。直接參考移植程序,這里不做說(shuō)明了。注意一點(diǎn)的是要屏蔽掉有關(guān)Systick的幾個(gè)函數,OS_COU_C.c文件里的有關(guān)函數也要屏蔽,這是因為我們在自己的程序里自己去定義我們需要的Systick函數。

(2)OS_CPU_C.c文件定義了OSTaskStkInit()函數和一些Hook函數,OSTaskStkInit()是任務(wù)切換時(shí)候用到的,Hook函數書(shū)操作系統給用戶(hù)擴展用的,因為操作系統輕易不能讓用戶(hù)修改,故留出一些接口供用戶(hù)擴展。

如上所述,屏蔽掉涉及Systick的函數和一些宏定義;

(3)OS_CPU_A.asm是一些用匯編寫(xiě)的函數,直接復制粘貼,需要修改的地方后面詳細介紹。

uC/OS-II移植時(shí)有兩個(gè)重要的中斷,一個(gè)是SysTick_Handler(),還一個(gè)是PendSV_Handler()。SysTick是心跳信號,SysTick 的最大使命,就是定期地產(chǎn)生異常請求,作為系統的時(shí)基。OS 都需要這種“滴答”來(lái)推動(dòng)任務(wù)和時(shí)間的管理。。PendSV掛起中斷操作,它的典型應用是進(jìn)行任務(wù)切換,操作系統在實(shí)際運行中具體會(huì )出現這樣的問(wèn)題,就是在任務(wù)切換的時(shí)候發(fā)生中斷,中斷必須得到響應,保證它的實(shí)時(shí)性,否則后果是不堪想象的。那么在 ISR 執行過(guò)程中,發(fā)生SysTick 異常,并且搶占了該ISR,OS 執行必要的操作,然后pend 起PendSV 異常以作好任務(wù)切換的準備,重新回到中斷,中斷完成后再進(jìn)行任務(wù)切換,具體參考《Cotex-M3權威指南》7.6節。如下圖:


再介紹一下另外幾個(gè)文件,在stm32f10x_it.h函數中的都是一些中斷入口函數,有SysTick_Handler()、PendSV_Handler()等函數,在CMSIS啟動(dòng)文件中定義了這些中斷的入口地址,包括SysTick_Handler()、PendSV_Handler()等,這樣就對應起來(lái)了,啟動(dòng)文件直接可以找到入口函數。OS需要心跳時(shí)鐘,所以我們直接在程序里初始化SysTick函數,在SysTick_Handler()函數中調用OSIntEnter();OSTimeTick();OSIntExit(),這很好理解了,就是把操作系統的時(shí)鐘和硬件時(shí)鐘對接上了。所以也就不需要OS_CPU.h和OS_CPU_C.c中的SysTick相關(guān)的定義了。

但官方為什么要在OS_CPU.h和OS_CPU_C.c中定義OS_CPU_SysTickHandler()這個(gè)名稱(chēng)的函數呢?其實(shí)在stm32f10x_it.h中已經(jīng)定義了SysTick_Handler()函數,這是因為官方用的是他自己的啟動(dòng)文件(兩個(gè)文件init.s,vectors.s。init.s負責進(jìn)入main(),vectors.s 設置中斷向量。),他的啟動(dòng)文件中的入口中斷地址名稱(chēng)OS_CPU_SysTickHandler()。同樣在啟動(dòng)文件中他也自己定義了OS_CPU_PendSVHandler()函數,所以在OS_CPU_A.asm中定義的入口函數也是OS_CPU_PendSVHandler()。而我們的啟動(dòng)文件是PendSV_Handler()。所以我前面遇到的卡死就是因為PendSV中斷沒(méi)找到對應的中斷處理函數。所以可以修改OS_CPU_A.asm,將OS_CPU_PendSVHandle全部替換成PendSV_Handler(),并且屏蔽掉stm32f10x_it.h中的PendSV_Handler()。另一種方法是只用修改啟動(dòng)文件,將PendSV_Handler()替換成OS_CPU_PendSVHandle()即可。

另外介紹兩個(gè)文件,一個(gè)是OS_cfg.h和App_cfg.h,這是兩個(gè)配置文件,OS_cfg.h是對OS進(jìn)行配置,比如OS_TICKS_PER_SEC配置、OS_TIME_DLY_HMSM_EN等對用到的模塊進(jìn)行使能操作。App_cfg.h是用戶(hù)自己按需要添加的,主要是設置任務(wù)堆棧大小,任務(wù)優(yōu)先級等。

這是我移植過(guò)程中學(xué)到的,菜鳥(niǎo)起步,理解還不是很深,難免有誤,歡迎指正。



關(guān)鍵詞: STM32移植uCOS-I

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>