📄 os_cpu.s
字号:
.module os_cpu.c
.area vector(rom, abs)
.org 14
rjmp _OSTickISR
.area text(rom, con, rel)
.dbfile C:\icc\minOS_iccavr\os_cpu.c
.dbfunc s InitOSTimer _InitOSTimer fI
.even
_InitOSTimer::
.dbline -1
.dbline 24
; /*
; *********************************************************************************************************
; * minOS 0.01v
; * The Real-Time OS Kernel
; * All Rights Reserved
; * File : OS_CPU.C
; * 作者 : 21icbbs网友 LM7556 ,2004年7月 by : LM7556 , China , 2004-2004
; *
; *********************************************************************************************************
; */
;
; #define OS_CPU_GLOBALS
; #include "OS_Includes.h"
;
; #pragma interrupt_handler OSTickISR:8 //uses Timer0 for time ticks.
;
; //;CPU specific definitions
; #define C51_CRYSTAL_FREQ 4000000ul
; //;Determine the reload values for timer 0 this is automated by the next macro
; #define T0_RELOAD C51_CRYSTAL_FREQ / OS_TICKS_PER_SEC / 1024
; #define T0_TCNT0 (256 - (T0_RELOAD & 0xff))
; //Initial OS Timer for time ticks --- 初始化时间节拍定时器。
; void InitOSTimer(void)
; {
.dbline 25
; TIMSK |= (1<<1); // set T0IE0
in R24,0x39
ori R24,2
out 0x39,R24
.dbline 26
; TCCR0 = 0x05; // CTC0=CK/1024
ldi R24,5
out 0x33,R24
.dbline 27
; TCNT0 = T0_TCNT0; // (256 - (T0_RELOAD & 0xff))
ldi R24,122
out 0x32,R24
.dbline 28
; SREG |= (1<<7); // SEI
bset 7
.dbline -2
.dbline 29
; }
L2:
.dbline 0 ; func end
ret
.dbfunc s OSTaskCreate _OSTaskCreate fI
; prio -> y+4
; tStk -> R22,R23
; tFunc -> R20,R21
.even
_OSTaskCreate::
rcall push_gset2
mov R22,R18
mov R23,R19
mov R20,R16
mov R21,R17
.dbline -1
.dbline 34
;
; //建立一个任务(Create a Task)。
; //Inport : tFunc --- function address , tStk --- stack bottom , prio --- Priority .
; void OSTaskCreate (void (*tFunc)(void) , OS_STK *tStk, INT8U prio)
; {
.dbline 35
; OSTCB[prio].OSTaskStatus = OS_TASK_Rdy;
ldd R18,y+4
clr R19
ldi R16,5
ldi R17,0
rcall mpy16s
mov R30,R16
mov R31,R17
ldi R24,<_OSTCB+2
ldi R25,>_OSTCB+2
add R30,R24
adc R31,R25
ldi R24,252
std z+0,R24
.dbline 36
; OSTCB[prio].OSStkTop = (INT16U)tStk-1 /* Initial value when main was called */
ldd R18,y+4
clr R19
ldi R16,5
ldi R17,0
rcall mpy16s
mov R30,R16
mov R31,R17
ldi R24,<_OSTCB
ldi R25,>_OSTCB
add R30,R24
adc R31,R25
mov R24,R22
mov R25,R23
sbiw R24,1
sbiw R24,12
sbiw R24,2
std z+0,R24
std z+1,R25
.dbline 40
; -12 /* reserve for to save R0-R5 , R26-R31 registers */
; -sizeof(INT16U) /* The PC value to be loaded */
; ;
; *--tStk = *(INT16U const *)tFunc & 0xff; /* Save low byte of task function address */
mov R24,R22
mov R25,R23
sbiw R24,1
mov R2,R24
mov R3,R25
mov R22,R2
mov R23,R3
mov R16,R20
mov R17,R21
rcall lpm16
mov R24,R16
mov R25,R17
andi R25,0
mov R30,R2
mov R31,R3
std z+0,R24
.dbline 41
; *--tStk = *(INT16U const *)tFunc / 0x100; /* Save high byte of task function address */
mov R24,R22
mov R25,R23
sbiw R24,1
mov R2,R24
mov R3,R25
mov R22,R2
mov R23,R3
mov R16,R20
mov R17,R21
rcall lpm16
mov R4,R16
mov R5,R17
mov R4,R5
clr R5
mov R30,R2
mov R31,R3
std z+0,R4
.dbline -2
.dbline 42
; }
L3:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l prio 4 c
.dbsym r tStk 22 pc
.dbsym r tFunc 20 pfI
.dbfunc s OSCtxSw _OSCtxSw fI
.even
_OSCtxSw::
.dbline -1
.dbline 48
;
; static unsigned int SaveSP; //用于保存需恢复的SP,在OSTickISR或用户中断结束做任务切换时,恢复SP.
;
; //context switch interrupt --- 软中断任务切换
; void OSCtxSw(void)
; {
.dbline 49
; asm("PUSH R31\n"
PUSH R31
PUSH R30
PUSH R29
PUSH R28
PUSH R27
PUSH R26
PUSH R0
PUSH R1
PUSH R2
PUSH R3
PUSH R4
PUSH R5
IN R31,0x3d
STS _SaveSP,R31
IN R31,0x3e
STS _SaveSP+1,R31
.dbline 70
; "PUSH R30\n"
; "PUSH R29\n"
; "PUSH R28\n"
; "PUSH R27\n"
; "PUSH R26\n"
;
; "PUSH R0\n"
; "PUSH R1\n"
; "PUSH R2\n"
; "PUSH R3\n"
; "PUSH R4\n"
; "PUSH R5\n"
;
; "IN R31,0x3d\n" //Save SPL
; "STS %SaveSP,R31\n"
; "IN R31,0x3e\n" //Save SPH
; "STS %SaveSP+1,R31\n"
;
; );
;
; OSTCB[OS_TASK_CrtPrio].OSStkTop = SaveSP; //Save the current task top.
lds R18,_OS_TASK_CrtPrio
clr R19
ldi R16,5
ldi R17,0
rcall mpy16s
mov R30,R16
mov R31,R17
ldi R24,<_OSTCB
ldi R25,>_OSTCB
add R30,R24
adc R31,R25
lds R3,_SaveSP+1
lds R2,_SaveSP
std z+0,R2
std z+1,R3
.dbline 72
;
; OS_TASK_CrtPrio=OS_TASK_HighPri;
lds R2,_OS_TASK_HighPri
sts _OS_TASK_CrtPrio,R2
.dbline 75
;
; // Load context from the stack
; SaveSP = OSTCB[OS_TASK_CrtPrio].OSStkTop; //load the high priority task task top.
mov R18,R2
clr R19
ldi R16,5
ldi R17,0
rcall mpy16s
mov R30,R16
mov R31,R17
ldi R24,<_OSTCB
ldi R25,>_OSTCB
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
sts _SaveSP+1,R3
sts _SaveSP,R2
.dbline 77
;
; asm("CLI\n"
CLI
LDS R31,_SaveSP
OUT 0x3d,R31
LDS R31,_SaveSP+1
OUT 0x3e,R31
SEI
POP R5
POP R4
POP R3
POP R2
POP R1
POP R0
POP R26
POP R27
POP R28
POP R29
POP R30
POP R31
.dbline -2
.dbline 98
; "LDS R31,%SaveSP\n"
; "OUT 0x3d,R31\n"
; "LDS R31,%SaveSP+1\n"
; "OUT 0x3e,R31\n"
; "SEI\n"
;
; "POP R5\n"
; "POP R4\n"
; "POP R3\n"
; "POP R2\n"
; "POP R1\n"
; "POP R0\n"
;
; "POP R26\n"
; "POP R27\n"
; "POP R28\n"
; "POP R29\n"
; "POP R30\n"
; "POP R31\n"
; );
; }
L5:
.dbline 0 ; func end
ret
.dbfunc s OSInitSP _OSInitSP fI
.even
_OSInitSP::
.dbline -1
.dbline 101
; //Initial CPU SP for main() function stack.
; void OSInitSP(void)
; {
.dbline 102
; SaveSP = (INT16U)&TASK_main_PrioStk[MAX_STK_SIZE-1]; //load the high priority task task top.
ldi R24,<_TASK_main_PrioStk+47
ldi R25,>_TASK_main_PrioStk+47
sts _SaveSP+1,R25
sts _SaveSP,R24
.dbline 103
; asm("POP R0\n"
POP R0
POP R1
LDS R31,_SaveSP
OUT 0x3d,R31
LDS R31,_SaveSP+1
OUT 0x3e,R31
PUSH R1
PUSH R0
.dbline -2
.dbline 112
; "POP R1\n"
; "LDS R31,%SaveSP\n"
; "OUT 0x3d,R31\n"
; "LDS R31,%SaveSP+1\n"
; "OUT 0x3e,R31\n"
; "PUSH R1\n"
; "PUSH R0\n"
; );
; }
L6:
.dbline 0 ; func end
ret
.dbfunc s OSTickISR _OSTickISR fI
.even
_OSTickISR::
rcall push_lset
.dbline -1
.dbline 116
;
; //OS Time Tick Interrupt,OS 时钟节拍中断.
; void OSTickISR(void)
; {
.dbline 117
; TCNT0 = T0_TCNT0; // (256 - (T0_RELOAD & 0xff))
ldi R24,122
out 0x32,R24
.dbline 118
; AppTickHook(); //Hook file for a time tick --- 用户每个时间节拍的钩子函数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -