uC/OS-II成功移植在STM32 上了,雖然理解還不是很深刻,但大體明白移植方法,以前曾經將uC/OS-II移植到MSP430F1611上,但是也沒關注那么多,現在按照網友的介紹進行移植,下載官方的V2.86版本的固件,自己建工程,修改Port部分,建立兩個任務,但是調試時死在程序死在了OSStart();里。經過單步發現程序的軟件中斷觸發后調用服務函數失敗,停在了OSStartHang BOSStartHang //停在這里,而且這里正常情況下不應該在這的;
本文引用地址:http://www.104case.com/article/201611/319066.htm然后就開始查問題,最終解決。發現無論學什么,一定要知其然知其所以然,不然學的永遠都只是皮毛。現在把自己的移植過程和理解記錄下來。
下載將官方的庫,Port部分是需要修改的部分,Source部分不用修改。
(1)OS_CPU.h文件下面定義類型名稱,堆棧類型OS_ENTER_CRITICAL(),OS_EXIT_CRITICAL()選方法3是最合適的;定義棧增長方向,STM32是高地址向低地址增長的,所以#define OS_STK_GROWTH 1 ;
另外再定義幾個函數。直接參考移植程序,這里不做說明了。注意一點的是要屏蔽掉有關Systick的幾個函數,OS_COU_C.c文件里的有關函數也要屏蔽,這是因為我們在自己的程序里自己去定義我們需要的Systick函數。
(2)OS_CPU_C.c文件定義了OSTaskStkInit()函數和一些Hook函數,OSTaskStkInit()是任務切換時候用到的,Hook函數書操作系統給用戶擴展用的,因為操作系統輕易不能讓用戶修改,故留出一些接口供用戶擴展。
如上所述,屏蔽掉涉及Systick的函數和一些宏定義;
(3)OS_CPU_A.asm是一些用匯編寫的函數,直接復制粘貼,需要修改的地方后面詳細介紹。
uC/OS-II移植時有兩個重要的中斷,一個是SysTick_Handler(),還一個是PendSV_Handler()。SysTick是心跳信號,SysTick 的最大使命,就是定期地產生異常請求,作為系統的時基。OS 都需要這種“滴答”來推動任務和時間的管理。。PendSV掛起中斷操作,它的典型應用是進行任務切換,操作系統在實際運行中具體會出現這樣的問題,就是在任務切換的時候發生中斷,中斷必須得到響應,保證它的實時性,否則后果是不堪想象的。那么在 ISR 執行過程中,發生SysTick 異常,并且搶占了該ISR,OS 執行必要的操作,然后pend 起PendSV 異常以作好任務切換的準備,重新回到中斷,中斷完成后再進行任務切換,具體參考《Cotex-M3權威指南》7.6節。如下圖:

再介紹一下另外幾個文件,在stm32f10x_it.h函數中的都是一些中斷入口函數,有SysTick_Handler()、PendSV_Handler()等函數,在CMSIS啟動文件中定義了這些中斷的入口地址,包括SysTick_Handler()、PendSV_Handler()等,這樣就對應起來了,啟動文件直接可以找到入口函數。OS需要心跳時鐘,所以我們直接在程序里初始化SysTick函數,在SysTick_Handler()函數中調用OSIntEnter();OSTimeTick();OSIntExit(),這很好理解了,就是把操作系統的時鐘和硬件時鐘對接上了。所以也就不需要OS_CPU.h和OS_CPU_C.c中的SysTick相關的定義了。
但官方為什么要在OS_CPU.h和OS_CPU_C.c中定義OS_CPU_SysTickHandler()這個名稱的函數呢?其實在stm32f10x_it.h中已經定義了SysTick_Handler()函數,這是因為官方用的是他自己的啟動文件(兩個文件init.s,vectors.s。init.s負責進入main(),vectors.s 設置中斷向量。),他的啟動文件中的入口中斷地址名稱OS_CPU_SysTickHandler()。同樣在啟動文件中他也自己定義了OS_CPU_PendSVHandler()函數,所以在OS_CPU_A.asm中定義的入口函數也是OS_CPU_PendSVHandler()。而我們的啟動文件是PendSV_Handler()。所以我前面遇到的卡死就是因為PendSV中斷沒找到對應的中斷處理函數。所以可以修改OS_CPU_A.asm,將OS_CPU_PendSVHandle全部替換成PendSV_Handler(),并且屏蔽掉stm32f10x_it.h中的PendSV_Handler()。另一種方法是只用修改啟動文件,將PendSV_Handler()替換成OS_CPU_PendSVHandle()即可。
另外介紹兩個文件,一個是OS_cfg.h和App_cfg.h,這是兩個配置文件,OS_cfg.h是對OS進行配置,比如OS_TICKS_PER_SEC配置、OS_TIME_DLY_HMSM_EN等對用到的模塊進行使能操作。App_cfg.h是用戶自己按需要添加的,主要是設置任務堆棧大小,任務優先級等。
這是我移植過程中學到的,菜鳥起步,理解還不是很深,難免有誤,歡迎指正。
評論