📄 os_cpu_a.s
字号:
;/***************************************Copyright (c)****************************************************
;** Guangzhou ZHIYUAN electronics Co.,LTD.
;**
;** http://www.embedtools.com
;**
;**-------------File Info---------------------------------------------------------------------------------
;** File name: os_cpu_s.s
;** Latest modified Date: 2007-11-20
;** Latest Version: 1.0
;** Descriptions: μCOS-II在lpc210x上的移植代码汇编代码部分,用ads1.2编译
;**-------------------------------------------------------------------------------------------------------
;** Created by: Chenmingji
;** Created date: 2007-11-20
;** Version: 1.0
;** Descriptions: The original version
;**
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;** Version:
;** Descriptions:
;**
;********************************************************************************************************/
;/********************************************************************************************************
; 宏定义
;********************************************************************************************************/
NoInt EQU 0x80
USR32Mode EQU 0x10
SVC32Mode EQU 0x13
SYS32Mode EQU 0x1f
IRQ32Mode EQU 0x12
FIQ32Mode EQU 0x11
T_bit EQU 0x20
CODE32
AREA |subr|, CODE, READONLY
IMPORT OSTCBCur ; 指向当前任务TCB的指针
IMPORT OSTCBHighRdy ; 指向将要运行的任务TCB的指针
IMPORT OSPrioCur ; 当前任务的优先级
IMPORT OSPrioHighRdy ; 将要运行的任务的优先级
IMPORT OSTaskSwHook ; 任务切换的钩子函数
IMPORT OSRunning ; uC/OS-II运行标志
IMPORT OSIntNesting ; 中断嵌套计数器
EXPORT OSIntCtxSw ; 中断退出时的入口
EXPORT SoftwareInterrupt ; 软中断入口
;/********************************************************************************************************
;** Function name: SoftwareInterrupt
;** Descriptions: 软件中断,用于提供一些系统服务
;** input parameters: 依功能而定
;** output parameters: 依功能而定
;** Returned value: 依功能而定
;** Created by: chenmingji
;** Created Date: 2007/11/20
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
SoftwareInterrupt
CMP R0, #8
LDRLO PC, [PC, R0, LSL #2]
MOVS PC, LR
SwiFunction
DCD TASK_SW ; 0
DCD _OSStartHighRdy ; 1
DCD ENTER_CRITICAL ; 2
DCD EXIT_CRITICAL ; 3
DCD ChangeToSYSMode ; 4
DCD ChangeToUSRMode ; 5
DCD ISRBegin ; 6
DCD OSISRNeedSwap ; 7
;/********************************************************************************************************
;** Function name: TASK_SW
;** Descriptions: 任务级调度
;** input parameters: none
;** output parameters: none
;** Returned value: none
;** Created by: chenmingji
;** Created Date: 2007/11/20
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
TASK_SW
MRS R3, SPSR ; 保存任务的CPSR
MOV R2, LR ; 保存任务的PC
MSR CPSR_c, #(NoInt | SYS32Mode) ; 切换到系统模式
STMFD SP!, {R2} ; 保存PC到堆栈
STMFD SP!, {R0-R12, LR} ; 保存R0-R12,LR到堆栈
; 因为R0~R3没有保存有用数据,
; 所以可以这样做
B OSIntCtxSw_0 ; 真正进行任务切换
;/********************************************************************************************************
;** Function name: ENTER_CRITICAL
;** Descriptions: 进入临界区
;** input parameters: none
;** output parameters: none
;** Returned value: none
;** Created by: chenmingji
;** Created Date: 2007/11/20
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
ENTER_CRITICAL
; GulOsEnterSum++
LDR R1, =GulOsEnterSum
LDRB R2, [R1]
CMP R2, #0xff
MOVEQS PC, LR
ADD R2, R2, #1
STRB R2, [R1]
; 关中断
MRS R0, SPSR
ORR R0, R0, #NoInt
MSR SPSR_c, R0
MOVS PC, LR
;/********************************************************************************************************
;** Function name: EXIT_CRITICAL
;** Descriptions: 退出临界区
;** input parameters: none
;** output parameters: none
;** Returned value: none
;** Created by: chenmingji
;** Created Date: 2007/11/20
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
EXIT_CRITICAL
; GulOsEnterSum--
LDR R1, =GulOsEnterSum
LDRB R2, [R1]
CMP R2, #0
MOVEQS PC, LR
SUB R2, R2, #1
STRB R2, [R1]
; if(GulOsEnterSum == 0) 开中断;
CMP R2, #0
MRSEQ R0, SPSR
BICEQ R0, R0, #NoInt
MSREQ SPSR_c, R0
MOVS PC, LR
;/********************************************************************************************************
;** Function name: ChangeToSYSMode
;** Descriptions: 任务切换到系统模式
;** input parameters: none
;** output parameters: none
;** Returned value: none
;** Created by: chenmingji
;** Created Date: 2007/11/20
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
ChangeToSYSMode
; 切换到系统模式
MRS R0, SPSR
BIC R0, R0, #0x1f
ORR R0, R0, #SYS32Mode
MSR SPSR_c, R0
MOVS PC, LR
;/********************************************************************************************************
;** Function name: ChangeToSYSMode
;** Descriptions: 任务切换到用户模式
;** input parameters: none
;** output parameters: none
;** Returned value: none
;** Created by: chenmingji
;** Created Date: 2007/11/20
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
ChangeToUSRMode
; 切换到用户模式
MRS R0, SPSR
BIC R0, R0, #0x1f
ORR R0, R0, #USR32Mode
MSR SPSR_c, R0
MOVS PC, LR
;/********************************************************************************************************
;** Function name: ISRBegin
;** Descriptions: ISR开始处理
;** input parameters: none
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -