從文件角度來看core_cm4.h和stm32f4xx.h分別從內核寄存器和外設寄存器來定義其地址和結構體,是用c語言訪問硬件必須的文件,所以這兩個文件不論是否帶操作系統,都是必須包含進工程的。
reset_handler這個中斷處理函數首先會設置一下FPU,然后跳轉到systeminit進行初始化,然后跳轉至main函數。
main函數在自己定義的main.c當中,完成BSP初始化,操作系統初始化,創建任務以及開始運行操作系統。BSP初始化中包含的有systeminit,systick_init,GPIO配置,systick_init啟動心跳時鍾。進入操作系統初始化后,就基本跟硬件操作無關了,基本上是使用系統提供的API進行處理即可。
ucos需要移植的代碼主要是port文件夾下,os_cpu.h中定義數據類型,處理器相關代碼及函數聲明:
typedef unsigned int OS_STK;棧的大小是用4字節來做基本單位
typedef unsigned int OS_CPU_SR;表示狀態寄存器,都是32位的
定義了宏OS_ENTER_CRITICAL和OS_EXIT_CRITICAL
后面就聲明一些匯編里定義的寄存器操作函數。
/************************************************************************/
在工程中會有一個很大的問題就是很多重復的函數定義和調用,ucos提供的中斷處理和it.c提供的中斷處理函數,到底執行哪一個還是依據中斷向量表的定義來看。
systick中斷處理函數在ucos提供的代碼里有定義,但我們可以將其注釋掉,再在it.c文件中定義
/************************************************************************/
os_cpu_a和os_cpu_c的頭文件是os_cpu.h,只是這兩個源文件分別是c和匯編寫的,只是頭文件中hook函數都沒有聲明。
os_cpu_c.c主要定義了一些hook函數,要使用的話需要在OS_CFG.h中啟用鈎子函數的功能
除hook之外還有系統心跳的函數以及棧初始化函數。
os_cpu_a.asm該文件包含的是匯編代碼下載下來的代碼是針對你的處理器移植好的,不需要做修改。
OSStart函數中最后調用的是OSStartHighRdy是啟動處於ready狀態的優先級最高的任務
keil編譯的結果,RO是只讀向量(const型),RW是讀寫變量,ZI是沒初始化的讀寫變量。
/************************************************************************/
之前的stm32開發目錄分為四個(啟動代碼,用戶代碼,固件庫,CMSIS)
再加入uCos之后文件的管理變得復雜不少,所以有一套文件管理目錄很重要:boot(啟動代碼),USR(main函數,中斷處理函數),BSP(系統硬件初始化,自行封裝的硬件驅動程序),APP(應用程序函數(死循環型)),uCos-II(port和source),CMSIS,FWlib
USER文件夾下新建includes.h頭文件,教程說該頭文件是保存全部頭文件的頭文件,方便理清函數思路。暫時還沒有這種感覺
os_cfg.h操作系統配置頭文件存放在APP文件夾中。
/************APP配置**************/
app_cfg.h用來設置應用程序的優先級及棧大小,在main函數中創建任務的時候就將棧的大小和優先級傳遞到任務創建函數中去。
實現多任務的方法有兩種在main函數中多次調用taskcreate或者在一個任務中再調用taskcreate這樣就能創建多任務了。