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 + -
显示快捷键?