STM32迷你板UCOSII系统移植
寫在前面:
所需要下載的UCOSII代碼鏈接:https://pan.baidu.com/s/1D_IyXhODEa5oVUdDv-GJrQ 提取碼:mte3
本文結(jié)構(gòu)
- 1.UCOSII簡介
- 2.UCOSII移植具體步驟
- 3.移植后的測試
- 4.總結(jié)
1.UCOSII簡介
UCOSII 是一個(gè)可以基于ROM 運(yùn)行的、可裁減的、搶占式、實(shí)時(shí)多任務(wù)內(nèi)核,具有高度可
移植性,特別適合于微處理器和控制器,是和很多商業(yè)操作系統(tǒng)性能相當(dāng)?shù)膶?shí)時(shí)操作系統(tǒng)
(RTOS)。
UCOSII 是專門為計(jì)算機(jī)的嵌入式應(yīng)用設(shè)計(jì)的, 絕大部分代碼是用C 語言編寫的。CPU 硬
件相關(guān)部分是用匯編語言編寫的、總量約200 行的匯編語言部分被壓縮到最低限度,為的是便
于移植到任何一種其它的CPU 上。用戶只要有標(biāo)準(zhǔn)的ANSI 的C 交叉編譯器,有匯編器、連
接器等軟件工具,就可以將UCOSII 嵌人到開發(fā)的產(chǎn)品中。UCOSII 具有執(zhí)行效率高、占用空間
小、實(shí)時(shí)性能優(yōu)良和可擴(kuò)展性強(qiáng)等特點(diǎn), 最小內(nèi)核可編譯至 2KB 。UCOSII 已經(jīng)移植到了幾
乎所有知名的CPU 上。
UCOSII體系結(jié)構(gòu)如圖所示
從上圖可以看出,UCOSII 的移植,我們只需要修改:os_cpu.h、os_cpu_a.asm 和os_cpu.c
等三個(gè)文件,其中:os_cpu.h,進(jìn)行數(shù)據(jù)類型的定義,以及處理器相關(guān)代碼和幾個(gè)函數(shù)原
型;os_cpu_a.asm,是移植過程中需要匯編完成的一些函數(shù),主要就是任務(wù)切換函數(shù);os_cpu.c,定義一些用戶HOOK函數(shù)。
2.UCOSII移植具體步驟
新建基礎(chǔ)工程,這里以跑馬燈工程為例。
UCOSII移植具體步驟
1.在基礎(chǔ)工程下建立相應(yīng)的文件夾:CONFIG,CORE,PORT
新建UCOSII文件夾
UCOSII文件夾下新建三個(gè)文件夾
2.向core文件夾添加UCOSII的源碼
在這個(gè)路徑下,找到UCOSII的源碼,也就是正點(diǎn)原子所帶的軟件資料:
將上面所有文件復(fù)制到CORE文件夾下,復(fù)制完的CORE文件夾下內(nèi)容:
3.向CONFIG文件添加內(nèi)容
此處的內(nèi)容需要在該路徑下找到,同樣為正點(diǎn)原子所帶的資料
添加好文件的CONFIG文件夾
4.向PORT文件夾下添加文件
文件路徑:
添加完的PORT文件夾
5.將上述三個(gè)文件添加到工程中
打開工程
點(diǎn)擊Manage Project Items,新建三個(gè)分組:UCOSII-CORE,UCOSII-CONFIG,UCOSII-PORT
向分組中添加文件
UCOSII-CORE分組添加如下,但是需要刪除掉ucos_ii.c文件,否則會報(bào)錯。
刪除掉ucos_ii.c文件之后
UCOSII-PORT分組添加如下
只需要添加如下三個(gè)文件os_cpu.h和os_cpu_a.asm和os_cpu_c.c
UCOSII-CONFIG分組添加如下
添加includes.h和os_cfg.h文件
添加完成后會發(fā)現(xiàn)工程目錄下多了三個(gè)文件夾
但是我們發(fā)現(xiàn)UCOSII-CORE文件下都是加鎖的
解決辦法是:找到CORE文件夾,更改文件夾屬性:去掉只讀
回過頭來查看發(fā)現(xiàn)文件枷鎖已經(jīng)去掉
下面需要將路徑包含進(jìn)來
點(diǎn)擊魔法棒,選擇C/C++,找到include paths
點(diǎn)擊后面的添加按鈕
添加進(jìn)來CORE,PORT,CONFIG文件
下面進(jìn)行編譯,發(fā)現(xiàn)報(bào)錯
..\UCOSII\CORE\ucos_ii.h(44): error: #5: cannot open source input file "app_cfg.h": No such file or directory
雙擊該錯誤,進(jìn)入到ucos_ii.h文件,找到該頭文件,由于我們不需要該頭文件,注釋掉即可
然后再次編譯
又發(fā)現(xiàn)另一個(gè)錯誤:PendSV_Handler 函數(shù)被重定義
解決辦法:刪除其中一個(gè)定義,由于匯編語言執(zhí)行起來更快,所以刪除stm32f10x_it.c文件下PendSV_Handler 函數(shù)的定義,這里采用注釋掉的方法
先找到重定義的地方
os_cpu_a.asm這是一個(gè)匯編文件
在stm32f10x_it.c文件下
解決:注釋掉
再次編譯,發(fā)現(xiàn)沒有錯誤
6.修改sys.h文件
打開該文件:位于SYSTEM文件夾下,找到sys.c文件
右擊sys.h選擇Open document sys.h
將SYSTEM_SUPPORT_OS 改為1,表示支持UCOS系統(tǒng)
修改前:
修改后:
再次編譯,有報(bào)錯:還是重定義的問題,同樣的,這里我們還是注釋掉stm32f10x_it.c文件下SysTick_Handler 函數(shù)
再次編譯發(fā)現(xiàn)沒有錯誤
這里需要注意的是os_cpu_c.h文件夾下的OSTaskStkInit函數(shù),當(dāng)移植時(shí)發(fā)現(xiàn)和下面的不一致時(shí),需要替換成下面的OSTaskStkInit函數(shù)。
3.移植后的測試
下面進(jìn)行UCOSII操作系統(tǒng)的測試
將下面代碼復(fù)制到main.c中,替換掉原來的代碼
編譯之后沒有錯誤,下載到開發(fā)板上
開發(fā)板出現(xiàn)led燈的交替閃爍,
再進(jìn)行串口測試,也就是浮點(diǎn)測試:每個(gè)500ms進(jìn)行+0.01的操作
至此,UCOSII操作系統(tǒng)移植成功。
4.總結(jié)
1) 移植UCOSII
要想U(xiǎn)COSII在STM32正常運(yùn)行,首先是需要移植UCOSII,正點(diǎn)原子提供的SYSTEM文件夾里面的系統(tǒng)函數(shù)直接支持UCOSII,只需要在sys.h文件里面將:SYSTEM_SUPPORT_UCOS宏定義改為1,即可通過delay_init函數(shù)初始化UCOSII的系統(tǒng)時(shí)鐘節(jié)拍,為UCOSII提供時(shí)鐘節(jié)拍。
2) 編寫任務(wù)函數(shù)并設(shè)置其堆棧大小和優(yōu)先級等參數(shù)。
編寫任務(wù)函數(shù),以便UCOSII調(diào)用。
設(shè)置函數(shù)堆棧大小,需要根據(jù)函數(shù)的需求來設(shè)置,如果任務(wù)函數(shù)的局部變量多,嵌套層數(shù)多,那么相應(yīng)的堆棧就得大一些,如果堆棧設(shè)置小了,很可能出現(xiàn)的結(jié)果就是CPU進(jìn)入HardFault,遇到這種情況,就必須把堆棧設(shè)置大一點(diǎn)了。另外,有些地方還需要注意堆棧字節(jié)對齊的問題,如果任務(wù)運(yùn)行出現(xiàn)莫名其妙的錯誤(比如用到sprintf出錯),請考慮是不是字節(jié)對齊的問題。
設(shè)置任務(wù)優(yōu)先級,這個(gè)需要根據(jù)任務(wù)的重要性和實(shí)時(shí)性設(shè)置,記住高優(yōu)先級的任務(wù)有優(yōu)先使用CPU的權(quán)利。
3) 初始化UCOSII,并在UCOSII中創(chuàng)建任務(wù)
調(diào)用OSInit初始化UCOSII,通過調(diào)用OSTaskCreate函數(shù)創(chuàng)建任務(wù)。
4) 啟動UCOSII
調(diào)用OSStart啟動UCOSII。
通過以上4個(gè)步驟,UCOSII就開始在STM32上面運(yùn)行。
總結(jié)
以上是生活随笔為你收集整理的STM32迷你板UCOSII系统移植的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 赛鸽电动车遥控器钥匙怎样拆卸?
- 下一篇: STM32mini使用UCOSII信号量