📄 os_cpu_a.s
字号:
; External Interrupts
EXTERN NMIException
EXTERN HardFaultException
EXTERN MemManageException
EXTERN BusFaultException
EXTERN UsageFaultException
EXTERN SVCHandler
EXTERN DebugMonitor
EXTERN PendSVC
EXTERN SysTickHandler
EXTERN WWDG_IRQHandler
EXTERN PVD_IRQHandler
EXTERN TAMPER_IRQHandler
EXTERN RTC_IRQHandler
EXTERN FLASH_IRQHandler
EXTERN RCC_IRQHandler
EXTERN EXTI0_IRQHandler
EXTERN EXTI1_IRQHandler
EXTERN EXTI2_IRQHandler
EXTERN EXTI3_IRQHandler
EXTERN EXTI4_IRQHandler
EXTERN DMAChannel1_IRQHandler
EXTERN DMAChannel2_IRQHandler
EXTERN DMAChannel3_IRQHandler
EXTERN DMAChannel4_IRQHandler
EXTERN DMAChannel5_IRQHandler
EXTERN DMAChannel6_IRQHandler
EXTERN DMAChannel7_IRQHandler
EXTERN ADC_IRQHandler
EXTERN USB_HP_CAN_TX_IRQHandler
EXTERN USB_LP_CAN_RX0_IRQHandler
EXTERN CAN_RX1_IRQHandler
EXTERN CAN_SCE_IRQHandler
EXTERN EXTI9_5_IRQHandler
EXTERN TIM1_BRK_IRQHandler
EXTERN TIM1_UP_IRQHandler
EXTERN TIM1_TRG_COM_IRQHandler
EXTERN TIM1_CC_IRQHandler
EXTERN TIM2_IRQHandler
EXTERN TIM3_IRQHandler
EXTERN TIM4_IRQHandler
EXTERN I2C1_EV_IRQHandler
EXTERN I2C1_ER_IRQHandler
EXTERN I2C2_EV_IRQHandler
EXTERN I2C2_ER_IRQHandler
EXTERN SPI1_IRQHandler
EXTERN SPI2_IRQHandler
EXTERN USART1_IRQHandler
EXTERN USART2_IRQHandler
EXTERN USART3_IRQHandler
EXTERN EXTI15_10_IRQHandler
EXTERN RTCAlarm_IRQHandler
EXTERN USBWakeUp_IRQHandler
AREA |subr|, CODE, READONLY
PRESERVE8
ExVectors
DCD 0 ; Top of Stack
DCD 0 ; Reset Handler
DCD NMIException ; NMI Handler
DCD HardFaultException ; Hard Fault Handler
DCD MemManageException ; MPU Fault Handler
DCD BusFaultException ; Bus Fault Handler
DCD UsageFaultException ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVCHandler ; SVCall Handler
DCD DebugMonitor ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSVC ; PendSV Handler
DCD SysTickHandler ; SysTick Handler
DCD WWDG_IRQHandler ; Window Watchdog
DCD PVD_IRQHandler ; PVD through EXTI Line detect
DCD TAMPER_IRQHandler ; Tamper
DCD RTC_IRQHandler ; RTC
DCD FLASH_IRQHandler ; Flash
DCD RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line 0
DCD EXTI1_IRQHandler ; EXTI Line 1
DCD EXTI2_IRQHandler ; EXTI Line 2
DCD EXTI3_IRQHandler ; EXTI Line 3
DCD EXTI4_IRQHandler ; EXTI Line 4
DCD DMAChannel1_IRQHandler ; DMA Channel 1
DCD DMAChannel2_IRQHandler ; DMA Channel 2
DCD DMAChannel3_IRQHandler ; DMA Channel 3
DCD DMAChannel4_IRQHandler ; DMA Channel 4
DCD DMAChannel5_IRQHandler ; DMA Channel 5
DCD DMAChannel6_IRQHandler ; DMA Channel 6
DCD DMAChannel7_IRQHandler ; DMA Channel 7
DCD ADC_IRQHandler ; ADC
DCD USB_HP_CAN_TX_IRQHandler ; USB High Priority or CAN TX
DCD USB_LP_CAN_RX0_IRQHandler ; USB Low Priority or CAN RX0
DCD CAN_RX1_IRQHandler ; CAN RX1
DCD CAN_SCE_IRQHandler ; CAN SCE
DCD EXTI9_5_IRQHandler ; EXTI Line 9..5
DCD TIM1_BRK_IRQHandler ; TIM1 Break
DCD TIM1_UP_IRQHandler ; TIM1 Update
DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation
DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
DCD TIM2_IRQHandler ; TIM2
DCD TIM3_IRQHandler ; TIM3
DCD TIM4_IRQHandler ; TIM4
DCD I2C1_EV_IRQHandler ; I2C1 Event
DCD I2C1_ER_IRQHandler ; I2C1 Error
DCD I2C2_EV_IRQHandler ; I2C2 Event
DCD I2C2_ER_IRQHandler ; I2C2 Error
DCD SPI1_IRQHandler ; SPI1
DCD SPI2_IRQHandler ; SPI2
DCD USART1_IRQHandler ; USART1
DCD USART2_IRQHandler ; USART2
DCD USART3_IRQHandler ; USART3
DCD EXTI15_10_IRQHandler ; EXTI Line 15..10
DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line
DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend
NVIC_INT_CTRL EQU 0xE000ED04 ; 中断控制寄存器
NVIC_SYSPRI2 EQU 0xE000ED20 ; 系统优先级寄存器(2)
NVIC_PENDSV_PRI EQU 0xFFFF0000 ; 软件中断和系统节拍中断
; (都为最低,0xff).
NVIC_PENDSVSET EQU 0x10000000 ; 触发软件中断的值.
IMPORT OSTCBCur
addr_OSTCBCur DCD OSTCBCur
IMPORT OSTCBHighRdy
addr_OSTCBHighRdy DCD OSTCBHighRdy
IMPORT OSPrioCur
addr_OSPrioCur DCD OSPrioCur
IMPORT OSPrioHighRdy
addr_OSPrioHighRdy DCD OSPrioHighRdy
IMPORT OSRunning
IMPORT OSIntEnter
IMPORT OSIntExit
IMPORT OSTimeTick
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function: OSStartHighRdy ;
; Purpose: To start the task with the highest priority during OS startup ;
; Processing: See uC/OS-II Task Level Context Switch flow chart ;
; Parameters: void ;
; Outputs: None ;
; Returns: void ;
; Notes: Called once during OSStart() ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
EXPORT OSStartHighRdy
OSStartHighRdy
LDR r0, =OSRunning ; OSRunning = 1
MOV r1, #1
STRB r1, [r0]
LDR r5, addr_OSTCBHighRdy ; Get highest priority task TCB address
LDR r5, [r5] ; get stack pointer
LDR sp, [r5] ; switch to the new stack
POP {r3-R12}
LDR r0, [sp,#0x1c]
MSR apsr, r0
POP {r0-r3,r12,r14}
ADD sp,sp,#8
bx lr
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function: OS_TASK_SW ;
; Purpose: To perform a context switch from the Task Level. ;
; Processing: See uC/OS-II Task Level Context Switch flow chart ;
; Parameters: void ;
; Outputs: None ;
; Returns: void ;
; Notes: The whole function is executed in CRITICAL state. See OSSched(). ;
; ;
; On entry, OSTCBCur and OSPrioCur hold the current TCB and priority ;
; and OSTCBHighRdy and OSPrioHighRdy contain the same for the task ;
; to be switched to. ;
; The following code assumes that the virtual memory is directly ;
; mapped into physical memory. If this is not true, the cache must ;
; be flushed at context switch to avoid address aliasing. ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
EXPORT OSCtxSw
OSCtxSw
PUSH {R4, R5}
LDR R4, =NVIC_INT_CTRL ;触发PendSV异常 (causes context switch)
LDR R5, =NVIC_PENDSVSET
STR R5, [R4]
MSR PRIMASK, r4
POP {R4, R5}
BX LR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function: OSIntCtxSW ;
; Purpose: To perform a context switch from the Interrupt Level. ;
; Processing: See uC/OS-II Interrupt Level Context Switch flow chart ;
; Parameters: void ;
; Outputs: None ;
; Returns: void ;
; Notes: The whole function is executed in CRITICAL state. See OSIntExit(). ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
EXPORT OSIntCtxSw
OSIntCtxSw
;OSPrioCur = OSPrioHighRdy
LDR r6, addr_OSPrioHighRdy
LDR r5, addr_OSPrioCur
LDRB r6, [r6]
STRB r6, [r5]
;OSTCBCur = OSTCBHighRdy
LDR r4, addr_OSTCBHighRdy
LDR r5, addr_OSTCBCur
LDR r4, [r4]
STR r4, [r5]
LDR sp, [r4]
POP {r0}
MSR PRIMASK, r0
POP {R4-R11,pc}
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function: OSTickISR ;
; Purpose: Timer0 Interrupt Sever ;
; Processing: Call OSTimeTick ;
; Parameters: void ;
; Outputs: None ;
; Returns: void ;
; Notes: ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
EXPORT OSTickISR
OSTickISR
PUSH {r4-r11,lr}
MRS R0, PRIMASK
PUSH {R0}
LDR r4, addr_OSTCBCur
LDR r4, [r4]
STR sp, [r4] ; OSTCBCur -> stkptr = sp
BL OSIntEnter
MRS r1, ipsr
LDR R0, =ExVectors
LDR r0,[r0,r1,lsl #0x2]
BLX r0
BL OSIntExit
POP {r0}
MSR PRIMASK, r0
POP {r4-r11,pc} ; start the new task
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function: OSPendSV ;
; Purpose: ;
; Processing: ;
; Parameters: void ;
; Outputs: None ;
; Returns: void ;
; Notes: ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
EXPORT OSPendSV
OSPendSV
CPSID I
PUSH {R4-R11,lr}
MRS R0, PRIMASK
PUSH {R0}
LDR R4, =OSTCBCur ; OSTCBCur->OSTCBStkPtr = SP;
LDR R4, [R4]
STR SP, [R4] ; R0 is SP of process being switched out
; at this point, entire context of process has been saved
; OSPrioCur = OSPrioHighRdy
LDR r4, =OSPrioCur
LDR r5, =OSPrioHighRdy
LDRB r6, [r5]
STRB r6, [r4]
; OSTCBCur = OSTCBHighRdy
LDR r4, =OSTCBHighRdy
LDR r5, =OSTCBCur
LDR r4, [r4]
STR r4, [r5]
LDR sp, [r4]
POP {r0}
MSR PRIMASK, r0
POP {R4-R11,pc}
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; CRITICAL SECTION METHOD 3 FUNCTIONS
;
; Description: Disable/Enable interrupts by preserving the state of interrupts. Generally speaking you
; would store the state of the interrupt disable flag in the local variable 'cpu_sr' and then
; disable interrupts. 'cpu_sr' is allocated in all of uC/OS-II's functions that need to
; disable interrupts. You would restore the interrupt disable state by copying back 'cpu_sr'
; into the CPU's status register.
; OS_CPU_SR OSCPUSaveSR()
; Arguments : none
; Returns : OS_CPU_SR
; OSCPURestoreSR(OS_CPU_SR cpu_sr)
; Arguments : OS_CPU_SR
; Returns : none
; Note(s) : These functions are used in general like this,
;
; void Task (void *data)
; {
; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; OS_CPU_SR cpu_sr;
; #endif
; :
; :
; OS_ENTER_CRITICAL(); /* cpu_sr = OSCPUSaveSR(); */
; :
; :
; OS_EXIT_CRITICAL(); /* OSCPURestoreSR(cpu_sr); */
; :
; :
; }
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
EXPORT CortexM3DisInt
CortexM3DisInt
MRS R0, PRIMASK
CPSID I ; Disable all the interrupts
BX LR
EXPORT CortexM3EnInt
CortexM3EnInt
MSR PRIMASK, R0
BX LR
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -