?? os_cpu_a.s
字號:
;** output parameters: none
;** Returned value: none
;** Created by: chenmingji
;** Created Date: 2007/11/20
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
ISRBegin
; OSIntNesting++
LDR R1, =OSIntNesting
LDRB R2, [R1]
ADD R2, R2, #1
STRB R2, [R1]
MOVS PC, LR
;/********************************************************************************************************
;** Function name: OSISRNeedSwap
;** Descriptions: 查看任務是否需要切換
;** input parameters: none
;** output parameters: none
;** Returned value: none
;** Created by: chenmingji
;** Created Date: 2007/11/20
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
OSISRNeedSwap
LDR R1, =OSTCBHighRdy
LDR R2, =OSTCBCur
CMP R1, R2
MOVEQ R0, #0
MOVNE R0, #1
MOVS PC, LR
;/********************************************************************************************************
;** Function name: OSIntCtxSw
;** Descriptions: 中斷退出時的入口
;** input parameters: R3: 當前任務的狀態寄存器CPSR(即SPSR的值)
;** R4-R12: 當前任務的R4-R11
;** 當前處理器模式的堆棧結構(出棧次序):R0-R3、R12、PC(當前任務的)
;** output parameters: none
;** Returned value: none
;** Created by: chenmingji
;** Created Date: 2007/11/20
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
OSIntCtxSw
; 下面為保存任務環境
LDR R2, [SP, #20] ; 獲取PC
LDR R12, [SP, #16] ; 獲取R12
MRS R0, CPSR
MSR CPSR_c, #(NoInt | SYS32Mode)
MOV R1, LR
STMFD SP!, {R1-R2} ; 保存LR,PC
STMFD SP!, {R4-R12} ; 保存R4-R12
MSR CPSR_c, R0
LDMFD SP!, {R4-R7} ; 獲取R0-R3
ADD SP, SP, #8 ; 出棧R12,PC
MSR CPSR_c, #(NoInt | SYS32Mode)
STMFD SP!, {R4-R7} ; 保存R0-R3
OSIntCtxSw_0
LDR R1, =GulOsEnterSum ; 獲取OsEnterSum
LDR R2, [R1]
STMFD SP!, {R2, R3} ; 保存CPSR,GulOsEnterSum
; 保存當前任務堆棧指針到當前任務的TCB
LDR R1, =OSTCBCur
LDR R1, [R1]
STR SP, [R1]
BL OSTaskSwHook ; 調用鉤子函數
; OSPrioCur <= OSPrioHighRdy
LDR R4, =OSPrioCur
LDR R5, =OSPrioHighRdy
LDRB R6, [R5]
STRB R6, [R4]
; OSTCBCur <= OSTCBHighRdy
LDR R6, =OSTCBHighRdy
LDR R6, [R6]
LDR R4, =OSTCBCur
STR R6, [R4]
OSIntCtxSw_1
; 獲取新任務堆棧指針
LDR R4, [R6]
ADD SP, R4, #68 ; 17寄存器CPSR,GulOsEnterSum,R0-R12,LR,SP
LDR LR, [SP, #-8]
MSR CPSR_c, #(NoInt | SVC32Mode) ; 進入管理模式
MOV SP, R4 ; 設置堆棧指針
LDMFD SP!, {R4, R5} ; CPSR,GulOsEnterSum
; 恢復新任務的OsEnterSum
LDR R3, =GulOsEnterSum
STR R4, [R3]
MSR SPSR_cxsf, R5 ; 恢復CPSR
LDMFD SP!, {R0-R12, LR, PC }^ ; 運行新任務
;/********************************************************************************************************
;** Function name: _OSStartHighRdy
;** Descriptions: uC/OS-II啟動時使用OSStartHighRdy運行第一個任務,
;** OSStartHighRdy會調用_OSStartHighRdy
;** input parameters: none
;** output parameters: none
;** Returned value: none
;** Created by: chenmingji
;** Created Date: 2007/11/20
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
_OSStartHighRdy
MSR CPSR_c, #(NoInt | SYS32Mode)
; 告訴uC/OS-II自身已經運行
LDR R4, =OSRunning
MOV R5, #1
STRB R5, [R4]
BL OSTaskSwHook ; 調用鉤子函數
LDR R6, =OSTCBHighRdy
LDR R6, [R6]
B OSIntCtxSw_1
;/********************************************************************************************************
;** Function name: TaskEntry
;** Descriptions: 所有任務的入口
;** input parameters: 與任務一樣
;** output parameters: 與任務一樣
;** Returned value: 與任務一樣
;** Created by: chenmingji
;** Created Date: 2007/11/20
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
EXPORT TaskEntry
TaskEntry
BX R14
;/*********************************************************************************************************
;** Function name: OSTaskStkInit
;** Descriptions: 任務堆棧初始化代碼,本函數調用失敗會使系統崩潰
;** input parameters: task: 任務開始執行的地址
;** pdata: 傳遞給任務的參數
;** ptos: 任務的堆棧開始位置
;** opt: 附加參數,當前版本對于本函數無用,具體意義參見OSTaskCreateExt()的opt參數
;** output parameters: none
;** Returned value: 新堆棧位置
;** Created by: LinEnqiang
;** Created Date: 2008/05/02
;**--------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**--------------------------------------------------------------------------------------------------------
;*********************************************************************************************************/
EXPORT OSTaskStkInit
OSTaskStkInit
MOV R3, R0
;/*
; * 建立任務環境,ADS1.2使用滿遞減堆棧
; */
MOV R0, R2
LDR R2, =TaskEntry
SWP R2,R2,[R0] ; pc,所有任務的入口
STMDB R0!,{R3} ; lr,任務真正的入口
MOV R2, #0
MOV R3, #0
STMDB R0!,{R2,R3} ; R12、R11
STMDB R0!,{R2,R3} ; R10、R9
STMDB R0!,{R2,R3} ; R8、R7
STMDB R0!,{R2,R3} ; R6、R5
STMDB R0!,{R2,R3} ; R4、R3
STMDB R0!,{R2,R3} ; R2、R1
MOV R2 , #0x10
STMDB R0!,{R1-R3} ; r0,第一個參數使用R0傳遞
; spsr,允許 IRQ, FIQ 中斷
; 關中斷計數器OsEnterSum;
BX R14
AREA MyEnterSumDatas, DATA, ALIGN = 2;
EXPORT GulOsEnterSum ; 任務關中斷計數器
GulOsEnterSum DCD 0
END
;/********************************************************************************************************
;** End Of File
;********************************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -