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

📄 os_cup_a.s

📁 uc_os II__PIC24fj128ga010
💻 S
字号:
;
;*******************************************************************************************
;
;                                        uC/OS-II
;                                  The Real-Time Kernel
;
;                         (c) Copyright 2006, Micrium, Weston, FL
;                                  All Rights Reserved
;
;
;                                   dsPIC33 MPLab Port
;
;
; File : os_cpu_a.s
; By : 不负责任的天使(^_^)
; Port Version : V2.51 
;*******************************************************************************************




;*******************************************************************************************
;                                     INCLUDES
;.equ     __24FJ128GA010, 1                                          ; Inform the p24FJ128GA010 header file that we are using a p24FJ128GA010
;*******************************************************************************************

;
			 
.include "p24fj128ga010.inc"                            ; Include assembly equates for various CPU registersand bit masks
.include "\UCOS-II V2.52\OS_CPU_REG_A.S"                ; Include an assembly utility files with macros for savingand 
                                                        ; restoring the CPU registers
;
;*******************************************************************************************

;                                   LINKER SPECIFICS

;*******************************************************************************************
;

.text                    ; Locate this file in the text region of the build

;
;*******************************************************************************************


;                                        GLOBALS

;*******************************************************************************************

; 

.global _OSStartHighRdy
.global _OSCtxSw
.global _OSIntCtxSw

;
;*******************************************************************************************


;                                       OSStartHighRdy
;
; Description : This function determines the highest priority task that is ready to run after 
;               OSInit() is called.
;*******************************************************************************************


;
_OSStartHighRdy:
call _OSTaskSwHook    		; Call user defined task switch hook
mov #0x0001, w0       		; Set OSRunning to TRUE
mov #_OSRunning, w1
mov.b w0, [w1]        		; Set OSRunning to TRUE
                      		; Get stack pointer of the task to resume
mov _OSTCBHighRdy, w0 		; Get the pointer to the stack to resume
mov [w0], w15 				; Dereference the pointer and store the data (the new
 							; stack address) W15, the stack pointer register
OS_REGS_RESTORE 			; Restore all of this tasks registers from thestack
retfie 						; Return from the interrupt, the task is now ready torun
;


;*******************************************************************************************
;                                      OSCtxSw
;
; Description : TThe code to perform a 'task level' context switch. OSCtxSw() is called
;               when a higher priority task is made ready to run by another task or,
;               when the current task can no longer execute (e.g. it calls OSTimeDly(),
;               OSSemPend() and the semaphore is not available, etc.).
;*******************************************************************************************

;
_OSCtxSw:
; TRAP (interrupt) should bring us here, not 'call'.
; Since dsPIC has no TRAP, it is necessary to correctthe stack to simulate an interrupt
; In other words, this function must also save SR andIPL3 to the stack, not just the PC.

mov.b SRL, wreg  				; Load SRL
sl w0, #8, w0 					; Shift left by 8
btsc CORCON, #IPL3 				; Test IPL3 bit, skip if clear
bset w0, #7						; Copy IPL3 to bit7 of w0
ior w0, [--w15], w0 			; Merge bits
mov w0, [w15++] 				; Write back
OS_REGS_SAVE 					; Save processor register; Save current task's stack pointer into the currect tasks TCB
mov _OSTCBCur, w0 				; Get the address of the location in this tasks TCB to store the stack pointer
mov w15, [w0] 					; Store the stack pointer in this tasks TCB
call _OSTaskSwHook 				; Call the user defined task switch hook
mov _OSTCBHighRdy, w1 		    ; Set the current running TCB to the TCB of the highest priority task ready to run
mov w1, _OSTCBCur
mov #_OSPrioHighRdy, w0
mov #_OSPrioCur, w2
mov.b [w0], [w2]
mov [w1], w15 					; Load W15 with the stack pointer from the task thatis ready to run
OS_REGS_RESTORE 				; Restore registers
retfie 							; Return from interrupt
;


;*******************************************************************************************
;                                     OSIntCtxSw
;
; Description : When an ISR (Interrupt Service Routine) completes, OSIntExit() is called to
; 				determine whether a more important task than the interrupted task needs to
; 				execute. If that's the case, OSIntExit() determines which task to run next
;				and calls OSIntCtxSw() to perform the actual context switch to that task.
;*******************************************************************************************
;
_OSIntCtxSw:
call _OSTaskSwHook 				; Call the user defined task switch hook
mov _OSTCBHighRdy, w1 			; Set the current running TCB to the TCB of thehighest priority task ready to run
mov w1, _OSTCBCur
mov #_OSPrioHighRdy, w0
mov #_OSPrioCur, w2
mov.b [w0], [w2]
mov [w1], w15           		; Load W15 with the stack pointer from the task that is ready to run
OS_REGS_RESTORE 				; Restore registers
retfie 							; Return from interrupt





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -