📄 os_cpu.lis
字号:
.module os_cpu.c
.area vector(rom, abs)
.org 14
000E AFC0 rjmp _OSTickISR
.area text(rom, con, rel)
0000 .dbfile C:\icc\minOS_iccavr\os_cpu.c
0000 .dbfunc s InitOSTimer _InitOSTimer fI
.even
0000 _InitOSTimer::
0000 .dbline -1
0000 .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)
; {
0000 .dbline 25
; TIMSK |= (1<<1); // set T0IE0
0000 89B7 in R24,0x39
0002 8260 ori R24,2
0004 89BF out 0x39,R24
0006 .dbline 26
; TCCR0 = 0x05; // CTC0=CK/1024
0006 85E0 ldi R24,5
0008 83BF out 0x33,R24
000A .dbline 27
; TCNT0 = T0_TCNT0; // (256 - (T0_RELOAD & 0xff))
000A 8AE7 ldi R24,122
000C 82BF out 0x32,R24
000E .dbline 28
; SREG |= (1<<7); // SEI
000E 7894 bset 7
0010 .dbline -2
0010 .dbline 29
; }
0010 L2:
0010 .dbline 0 ; func end
0010 0895 ret
0012 .dbfunc s OSTaskCreate _OSTaskCreate fI
; prio -> y+4
; tStk -> R22,R23
; tFunc -> R20,R21
.even
0012 _OSTaskCreate::
0012 00D0 rcall push_gset2
0014 622F mov R22,R18
0016 732F mov R23,R19
0018 402F mov R20,R16
001A 512F mov R21,R17
001C .dbline -1
001C .dbline 34
;
; //建立一个任务(Create a Task)。
; //Inport : tFunc --- function address , tStk --- stack bottom , prio --- Priority .
; void OSTaskCreate (void (*tFunc)(void) , OS_STK *tStk, INT8U prio)
; {
001C .dbline 35
; OSTCB[prio].OSTaskStatus = OS_TASK_Rdy;
001C 2C81 ldd R18,y+4
001E 3327 clr R19
0020 05E0 ldi R16,5
0022 10E0 ldi R17,0
0024 00D0 rcall mpy16s
0026 E02F mov R30,R16
0028 F12F mov R31,R17
002A 80E0 ldi R24,<_OSTCB+2
002C 90E0 ldi R25,>_OSTCB+2
002E E80F add R30,R24
0030 F91F adc R31,R25
0032 8CEF ldi R24,252
0034 8083 std z+0,R24
0036 .dbline 36
; OSTCB[prio].OSStkTop = (INT16U)tStk-1 /* Initial value when main was called */
0036 2C81 ldd R18,y+4
0038 3327 clr R19
003A 05E0 ldi R16,5
003C 10E0 ldi R17,0
003E 00D0 rcall mpy16s
0040 E02F mov R30,R16
0042 F12F mov R31,R17
0044 80E0 ldi R24,<_OSTCB
0046 90E0 ldi R25,>_OSTCB
0048 E80F add R30,R24
004A F91F adc R31,R25
004C 862F mov R24,R22
004E 972F mov R25,R23
0050 0197 sbiw R24,1
0052 0C97 sbiw R24,12
0054 0297 sbiw R24,2
0056 8083 std z+0,R24
0058 9183 std z+1,R25
005A .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 */
005A 862F mov R24,R22
005C 972F mov R25,R23
005E 0197 sbiw R24,1
0060 282E mov R2,R24
0062 392E mov R3,R25
0064 622D mov R22,R2
0066 732D mov R23,R3
0068 042F mov R16,R20
006A 152F mov R17,R21
006C 00D0 rcall lpm16
006E 802F mov R24,R16
0070 912F mov R25,R17
0072 9070 andi R25,0
0074 E22D mov R30,R2
0076 F32D mov R31,R3
0078 8083 std z+0,R24
007A .dbline 41
; *--tStk = *(INT16U const *)tFunc / 0x100; /* Save high byte of task function address */
007A 862F mov R24,R22
007C 972F mov R25,R23
007E 0197 sbiw R24,1
0080 282E mov R2,R24
0082 392E mov R3,R25
0084 622D mov R22,R2
0086 732D mov R23,R3
0088 042F mov R16,R20
008A 152F mov R17,R21
008C 00D0 rcall lpm16
008E 402E mov R4,R16
0090 512E mov R5,R17
0092 452C mov R4,R5
0094 5524 clr R5
0096 E22D mov R30,R2
0098 F32D mov R31,R3
009A 4082 std z+0,R4
009C .dbline -2
009C .dbline 42
; }
009C L3:
009C 00D0 rcall pop_gset2
009E .dbline 0 ; func end
009E 0895 ret
00A0 .dbsym l prio 4 c
00A0 .dbsym r tStk 22 pc
00A0 .dbsym r tFunc 20 pfI
00A0 .dbfunc s OSCtxSw _OSCtxSw fI
.even
00A0 _OSCtxSw::
00A0 .dbline -1
00A0 .dbline 48
;
; static unsigned int SaveSP; //用于保存需恢复的SP,在OSTickISR或用户中断结束做任务切换时,恢复SP.
;
; //context switch interrupt --- 软中断任务切换
; void OSCtxSw(void)
; {
00A0 .dbline 49
; asm("PUSH R31\n"
00A0 FF93 PUSH R31
00A2 EF93 PUSH R30
00A4 DF93 PUSH R29
00A6 CF93 PUSH R28
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -