os_cpu_a.asm

来自「基于TI的2407移植的ucos程序范例」· 汇编 代码 · 共 144 行

ASM
144
字号
;/*
*********************************************************************************************************
*                                               uC/OS-II
*                                              实时内核
*
*                        (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL
*                                               版权所有
*
*                                            TMS320LF24x DSP 专用代码
*                                           TI CCS Ver4.10.36仿真软件编译
*
* 文件名 : OS_CPU_A.ASM
* 作者   : Jean J. Labrosse
* 改编   : 尹叶丹(yinyedan),Postgraduate, yinyedan@163.com,2003,8,19
*					Automation School,Wuhan University of Technology    
*********************************************************************************************************
*/ 
	.include "lf2407a.h"
	.include "F2407REGS.H"
            .global _OSTickISR
            .global _OSStartHighRdy
            .global _OSCtxSw
            .global _OSIntCtxSw 
            .global _OSIntEnter

            .global  _OSIntExit
            .global  _OSTimeTick
            .global  _OSTaskSwHook
            
            .global  _OSIntNesting
            .global  _OSTickDOSCtr
            .global  _OSPrioHighRdy
            .global  _OSPrioCur
            .global  _OSRunning
            .global  _OSTCBCur
            .global  _OSTCBHighRdy
            .global	 I$$SAVE
            .global	 I$$REST  
            .global	 PVECTORS  

_OSStartHighRdy:  

	LAR AR1,#_OSTCBCur	;得到当前最高优先级任务的地址
	LAR AR1,*			;指向当前就绪的最高优先级任务
	LAR AR1,*			;得到当前就绪的最高优先级任务的堆栈指针  

	B	I$$REST			;调用TI的库函数,从任务栈中恢复被保护的内容

;*********************************************************************************************************
;                                PERFORM A CONTEXT SWITCH (From task level)
;                                           void OSCtxSw(void)
;
; Note(s): 1) Upon entry, 
;             OSTCBCur     points to the OS_TCB of the task to suspend
;             OSTCBHighRdy points to the OS_TCB of the task to resume
;
;          2) The stack frame of the task to suspend looks as follows:
;
;                 SP -> OFFSET  of task to suspend    (Low memory)
;                       SEGMENT of task to suspend      
;                       PSW     of task to suspend    (High memory)  
;
;          3) The stack frame of the task to resume looks as follows:
; 
;                 OSTCBHighRdy->OSTCBStkPtr --> DS                               (Low memory)
;                                               ES
;                                               DI
;                                               SI
;                                               BP
;                                               SP
;                                               BX
;                                               DX
;                                               CX
;                                               AX
;                                               OFFSET  of task code address
;                                               SEGMENT of task code address
;                                               Flags to load in PSW             (High memory)
;*********************************************************************************************************

;_OSCtxSw    PROC   FAR
;
;            PUSHA                                  ; Save current task's context
;            PUSH   ES                              ; 
;            PUSH   DS                              ; 
;
 ;           MOV    AX, SEG _OSTCBCur               ; Reload DS in case it was altered
 ;           MOV    DS, AX                          ; 
;
;            LES    BX, DWORD PTR DS:_OSTCBCur      ; OSTCBCur->OSTCBStkPtr = SS:SP
;            MOV    ES:[BX+2], SS                   ; 
;            MOV    ES:[BX+0], SP                   ; 
;
;            CALL   FAR PTR _OSTaskSwHook           ; Call user defined task switch hook
;
;            MOV    AX, WORD PTR DS:_OSTCBHighRdy+2 ; OSTCBCur = OSTCBHighRdy
;            MOV    DX, WORD PTR DS:_OSTCBHighRdy   ; 
 ;           MOV    WORD PTR DS:_OSTCBCur+2, AX     ; 
;            MOV    WORD PTR DS:_OSTCBCur, DX       ; 
;
;            MOV    AL, BYTE PTR DS:_OSPrioHighRdy  ; OSPrioCur = OSPrioHighRdy
;            MOV    BYTE PTR DS:_OSPrioCur, AL      ;     
;
 ;           LES    BX, DWORD PTR DS:_OSTCBHighRdy  ; SS:SP = OSTCBHighRdy->OSTCBStkPtr
;            MOV    SS, ES:[BX+2]                   ; 
;            MOV    SP, ES:[BX]                     ; 
;
;            POP    DS                              ; Load new task's context
;            POP    ES                              ; 
;            POPA                                   ; 
;
;            IRET                                   ; Return to new task
;
;_OSCtxSw    ENDP

 ;           PAGE                                   ; /*$PAGE*/
 
_OSCtxSw:						;实现任务切换功能
		;	MAR		*,AR1
		;;	LAR		AR1,#_OSTCBCur
		;	LAR		AR1,*
		;	LAR		AR1,*
		;	SBRK	#22
			
			
			CALL	I$$SAVE		;调用TI的函数保存当前任务的环境
_OSCtxSw_0:
		;	LDP		#_OSPrioCur>>7
		;	BLDD	#_OSPrioHighRdy,_OSPrioCur
			
			             ;(?????????)
			LDP		#_OSPrioHighRdy;该变量存在第4页 (这里页指针很奇怪)
			LACL	_OSPrioHighRdy
			LDP		#_OSPrioCur  
			SACL	_OSPrioCur
								;	实现OSPrioCur=OSPrioHighRdy
			LAR		AR2,#_OSTCBCur		;得到当前TCB的地址
			MAR		*,AR2
			LAR		AR0,*,AR0			;使AR0指向当前TCB,并使AR0成为当前
			SAR		AR1,*				;将当前任务的堆栈指针保存到当前TCB中
			LAR		AR0,#_OSTCBHighRdy	;得到就绪的高优先级任务的地址   
			LAR		AR0,*               ;使AR0指向就绪的最高优先级的任务
			LAR		AR1,*,AR2			;得到就绪的高优先级任务的堆栈指针
			SAR		AR0,*,AR1			;使就绪的高优先级任务成为当前的任务
			B		I$$REST				;从就绪的高优先级任务的堆栈中恢复任务环

⌨️ 快捷键说明

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