23.2 uCos-II移植
23.2.1 在工程中添加相應的文件
(1)在工程目錄下建立UCOSII文件夾,并在該文件夾內新建三個文件夾CONFIG,CORE和PORT
(2)將除了os_cfg_r.h和os_dbg_r.c這兩個文件以外的所有文件全部復制到CORE文件夾下
(3)在CONFIG文件夾中新建includes.h文件和os_cfg.h文件
(4)在PORT文件夾中新建os_cpu.h,os_cpu_a.asm,os_cpu_c.c這3個文件
(5)在工程中添加這三個目錄下的文件,如下圖所示。
注:不要把ucos-ii.c文件添加到UCOS-CORE分組中,否則會提示有重復定義錯誤。
23.2.2 文件修改
我們編譯工程后可以發現報了11個錯誤,但都是同一個錯誤,如下圖所示。
我們在移植的時候并沒有發現這個文件,那是因為我們并沒有用到這個文件,這個文件是在ucos-ii.h文件中引用的,我們跳轉到這個文件將其屏蔽掉。
注 :我們可以發現在修改的時候,文件雖然可以打開,但是修改不了,這是因為我們下載的源碼都被設置成了只讀模式,在工程中只讀文件會有一個鑰匙的標志,這就需要我們將文件的只讀屬性去掉即可。
去掉只讀屬性之后,我們會發現項目中的文件上鑰匙標志消失了,如下圖所示。
此時,我們就可以對文件內容進行修改了。打開ucos_ii.h文件,屏蔽44行的文件引用,如下圖所示。
此時會發現報更多的錯誤,此時我們進行新建文件的修改。
(1)os_cpu_a.asm文件詳解
①這部分代碼主要用于定義外部變量,IMPORT表示這是一個外部變量,不是在本程序內定義的,EXPORT則表示這些函數位于該文件內,供其他文件調用,類似于C語言中的extern關鍵字。
IMPORT OSRunning
IMPORT OSPrioCur
IMPORT OSPrioHighRdy
IMPORT OSTCBCur
IMPORT OSTCBHighRdy
IMPORT OSIntNesting
IMPORT OSIntExit
IMPORT OSTaskSwHook
EXPORT OSStartHighRdy
EXPORT OSCtxSw
EXPORT OSIntCtxSw
EXPORT OS_CPU_SR_Save
EXPORT OS_CPU_SR_Restore
EXPORT PendSV_Handler
②EQU和C語言中的define關鍵字一樣,用于宏定義,定義了一些寄存器的地址
NVIC_INT_CTRL EQU 0xE000ED04 ;中斷控制寄存器
NVIC_SYSPRI2 EQU 0xE000ED20 ;系統優先級寄存器
NVIC_PENDSV_PRI EQU 0xFFFF0000 ;PendSV中斷和系統節拍中斷
NVIC_PENDSVSET EQU 0x10000000 ;觸發軟件中斷的值
PRESERVE8
AREA |.text|, CODE, READONLY
THUMB
③OS_CPU_SR_Save和OS_CPU_SR_Restore是用于開關中斷的匯編函數,通過給PRIMASK寫1來關閉中斷,寫0來開啟中斷,這里也可以使用CPS指令來快速開關中斷
OS_CPU_SR_Save
MRS R0, PRIMASK ;讀取PRIMASK到R0,R0為返回值
CPSID I ;PRIMASK=1,關中斷(NMI和硬件FAULT可以響應)
BX LR ;返回
OS_CPU_SR_Restore
MSR PRIMASK, R0 ;讀取R0到PRIMASK中,R0為參數
BX LR ;返回
④OSStartHighRdy是由OSStart()調用,用來開啟多任務,如果多任務開啟失敗就會進入OSStartHang函數中
OSStartHighRdy
LDR R4, =NVIC_SYSPRI2 ;設置PendSV優先級
LDR R5, =NVIC_PENDSV_PRI
STR R5, [R4]
MOV R4, #0 ;設置PSP=0
MSR PSP, R4
LDR R4, =OSRunning ;設置OSRunning=1
MOV R5, #1
STRB R5, [R4]
;切換到最高優先級的任務
LDR R4, =NVIC_INT_CTRL ;R4=NVIC_INT_CTRL
LDR R5, =NVIC_PENDSVSET ;R5=NVIC_PENDSVSET
STR R5, [R4]
CPSIE I ;開啟所有中斷
OSStartHang
B OSStartHang ;死循環
-
單片機
+關注
關注
6039文章
44575瀏覽量
636386 -
操作系統
+關注
關注
37文章
6847瀏覽量
123427 -
uCOS-Ⅱ
+關注
關注
0文章
9瀏覽量
8607
發布評論請先 登錄
相關推薦
評論