⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_cpu_a.s

📁 UCOS-II FOR STM32F103XX 1 本程序是我自己移植
💻 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 + -