📄 minos_avr.lst
字号:
(0065)
(0066) #if OS_TIME_DLY_EN
(0067) //OS Time Delay --- 使任务延时Tdly个时间节拍
(0068) void OSTimeDly(INT16U Tdly) /* Delay Tdly clock tick */
(0069) {
(0070) OSTCB[OS_TASK_CrtPrio].OSTimeDly=Tdly+OS_TASK_TimeOut;
010A 9120013A LDS R18,_OS_TASK_CrtPrio
010C 2733 CLR R19
010D E005 LDI R16,5
010E E010 LDI R17,0
010F D10A RCALL mpy16s
0110 2FE0 MOV R30,R16
0111 2FF1 MOV R31,R17
0112 E283 LDI R24,0x23
0113 E091 LDI R25,1
0114 0FE8 ADD R30,R24
0115 1FF9 ADC R31,R25
0116 8340 STD R20,0+Z
0117 8351 STD R21,1+Z
(0071) OSTCB[OS_TASK_CrtPrio].OSTaskStatus=OS_TASK_WaitTicks;
0118 9120013A LDS R18,_OS_TASK_CrtPrio
011A 2733 CLR R19
011B E005 LDI R16,5
011C E010 LDI R17,0
011D D0FC RCALL mpy16s
011E 2FE0 MOV R30,R16
011F 2FF1 MOV R31,R17
0120 E282 LDI R24,0x22
0121 E091 LDI R25,1
0122 0FE8 ADD R30,R24
0123 1FF9 ADC R31,R25
0124 EF8A LDI R24,0xFA
0125 8380 STD R24,0+Z
(0072) OSSched();
0126 D025 RCALL _OSSched
(0073) }
0127 D137 RCALL pop_gset1
0128 9508 RET
_OSTaskSuspend:
TaskPrio --> R20
0129 D132 RCALL push_gset1
012A 2F40 MOV R20,R16
(0074) #endif
(0075)
(0076) #if OS_TASK_SUSPEND_EN>0
(0077) //把正在运行的任务挂起(Suspend a task)。
(0078) void OSTaskSuspend(INT8U TaskPrio)
(0079) {
(0080) OSTCB[TaskPrio].OSTaskStatus=OS_TASK_Suspend;
012B 2F24 MOV R18,R20
012C 2733 CLR R19
012D E005 LDI R16,5
012E E010 LDI R17,0
012F D0EA RCALL mpy16s
0130 2FE0 MOV R30,R16
0131 2FF1 MOV R31,R17
0132 E282 LDI R24,0x22
0133 E091 LDI R25,1
0134 0FE8 ADD R30,R24
0135 1FF9 ADC R31,R25
0136 EF8D LDI R24,0xFD
0137 8380 STD R24,0+Z
(0081) OSSched();
0138 D013 RCALL _OSSched
(0082) }
0139 D125 RCALL pop_gset1
013A 9508 RET
_OSTaskResume:
TaskPrio --> R20
013B D120 RCALL push_gset1
013C 2F40 MOV R20,R16
(0083) #endif
(0084)
(0085) #if OS_TASK_Resume_EN>0
(0086) // 恢复被挂起的任务(resume a task)。
(0087) void OSTaskResume(INT8U TaskPrio)
(0088) {
(0089) OSTCB[TaskPrio].OSTaskStatus=OS_TASK_Rdy;
013D 2F24 MOV R18,R20
013E 2733 CLR R19
013F E005 LDI R16,5
0140 E010 LDI R17,0
0141 D0D8 RCALL mpy16s
0142 2FE0 MOV R30,R16
0143 2FF1 MOV R31,R17
0144 E282 LDI R24,0x22
0145 E091 LDI R25,1
0146 0FE8 ADD R30,R24
0147 1FF9 ADC R31,R25
0148 EF8C LDI R24,0xFC
0149 8380 STD R24,0+Z
(0090) }
014A D114 RCALL pop_gset1
014B 9508 RET
(0091) #endif
(0092)
(0093) //任务调度,把CPU控制权转到优先级最高的处于就绪态的任务。如果没有处于就绪态的任务,就地等待,
(0094) void OSSched(void)
(0095) {
(0096) do
(0097) {
(0098) OS_TASK_HighPri=OSPrioHighRdy();
_OSSched:
014C DF5C RCALL _OSPrioHighRdy
014D 2E20 MOV R2,R16
014E 2E31 MOV R3,R17
014F 92200139 STS R2,_OS_TASK_HighPri
(0099) } while (OS_TASK_HighPri==no_TASK_Rdy);
0151 91800139 LDS R24,_OS_TASK_HighPri
0153 3F8F CPI R24,0xFF
0154 F3B9 BEQ 0x014C
(0100) OSTCB[OS_TASK_HighPri].OSTaskStatus=OS_TASK_Run;
0155 2F28 MOV R18,R24
0156 2733 CLR R19
0157 E005 LDI R16,5
0158 E010 LDI R17,0
0159 D0C0 RCALL mpy16s
015A 2FE0 MOV R30,R16
015B 2FF1 MOV R31,R17
015C E282 LDI R24,0x22
015D E091 LDI R25,1
015E 0FE8 ADD R30,R24
015F 1FF9 ADC R31,R25
0160 EF8B LDI R24,0xFB
0161 8380 STD R24,0+Z
(0101) OS_TASK_INT();
0162 D051 RCALL _OSCtxSw
(0102) }
0163 9508 RET
FILE: C:\icc\minOS_iccavr\os_cpu.c
(0000) /*
(0001) *********************************************************************************************************
(0002) * minOS 0.01v
(0003) * The Real-Time OS Kernel
(0004) * All Rights Reserved
(0005) * File : OS_CPU.C
(0006) * 作者 : 21icbbs网友 LM7556 ,2004年7月 by : LM7556 , China , 2004-2004
(0007) *
(0008) *********************************************************************************************************
(0009) */
(0010)
(0011) #define OS_CPU_GLOBALS
(0012) #include "OS_Includes.h"
(0013)
(0014) #pragma interrupt_handler OSTickISR:8 //uses Timer0 for time ticks.
(0015)
(0016) //;CPU specific definitions
(0017) #define C51_CRYSTAL_FREQ 4000000ul
(0018) //;Determine the reload values for timer 0 this is automated by the next macro
(0019) #define T0_RELOAD C51_CRYSTAL_FREQ / OS_TICKS_PER_SEC / 1024
(0020) #define T0_TCNT0 (256 - (T0_RELOAD & 0xff))
(0021) //Initial OS Timer for time ticks --- 初始化时间节拍定时器。
(0022) void InitOSTimer(void)
(0023) {
(0024) TIMSK |= (1<<1); // set T0IE0
_InitOSTimer:
0164 B789 IN R24,P39
0165 6082 ORI R24,2
0166 BF89 OUT P39,R24
(0025) TCCR0 = 0x05; // CTC0=CK/1024
0167 E085 LDI R24,5
0168 BF83 OUT P33,R24
(0026) TCNT0 = T0_TCNT0; // (256 - (T0_RELOAD & 0xff))
0169 E78A LDI R24,0x7A
016A BF82 OUT P32,R24
(0027) SREG |= (1<<7); // SEI
016B 9478 BSET 7
(0028) }
016C 9508 RET
_OSTaskCreate:
prio --> Y+4
tStk --> R22
tFunc --> R20
016D D105 RCALL push_gset2
016E 2F62 MOV R22,R18
016F 2F73 MOV R23,R19
0170 2F40 MOV R20,R16
0171 2F51 MOV R21,R17
(0029)
(0030) //建立一个任务(Create a Task)。
(0031) //Inport : tFunc --- function address , tStk --- stack bottom , prio --- Priority .
(0032) void OSTaskCreate (void (*tFunc)(void) , OS_STK *tStk, INT8U prio)
(0033) {
(0034) OSTCB[prio].OSTaskStatus = OS_TASK_Rdy;
0172 812C LDD R18,4+Y
0173 2733 CLR R19
0174 E005 LDI R16,5
0175 E010 LDI R17,0
0176 D0A3 RCALL mpy16s
0177 2FE0 MOV R30,R16
0178 2FF1 MOV R31,R17
0179 E282 LDI R24,0x22
017A E091 LDI R25,1
017B 0FE8 ADD R30,R24
017C 1FF9 ADC R31,R25
017D EF8C LDI R24,0xFC
017E 8380 STD R24,0+Z
(0035) OSTCB[prio].OSStkTop = (INT16U)tStk-1 /* Initial value when main was called */
017F 812C LDD R18,4+Y
0180 2733 CLR R19
0181 E005 LDI R16,5
0182 E010 LDI R17,0
0183 D096 RCALL mpy16s
0184 2FE0 MOV R30,R16
0185 2FF1 MOV R31,R17
0186 E280 LDI R24,0x20
0187 E091 LDI R25,1
0188 0FE8 ADD R30,R24
0189 1FF9 ADC R31,R25
018A 2F86 MOV R24,R22
018B 2F97 MOV R25,R23
018C 9701 SBIW R24,1
018D 970C SBIW R24,0xC
018E 9702 SBIW R24,2
018F 8380 STD R24,0+Z
0190 8391 STD R25,1+Z
(0036) -12 /* reserve for to save R0-R5 , R26-R31 registers */
(0037) -sizeof(INT16U) /* The PC value to be loaded */
(0038) ;
(0039) *--tStk = *(INT16U const *)tFunc & 0xff; /* Save low byte of task function address */
0191 2F86 MOV R24,R22
0192 2F97 MOV R25,R23
0193 9701 SBIW R24,1
0194 2E28 MOV R2,R24
0195 2E39 MOV R3,R25
0196 2D62 MOV R22,R2
0197 2D73 MOV R23,R3
0198 2F04 MOV R16,R20
0199 2F15 MOV R17,R21
019A D0DD RCALL lpm16
019B 2F80 MOV R24,R16
019C 2F91 MOV R25,R17
019D 7090 ANDI R25,0
019E 2DE2 MOV R30,R2
019F 2DF3 MOV R31,R3
01A0 8380 STD R24,0+Z
(0040) *--tStk = *(INT16U const *)tFunc / 0x100; /* Save high byte of task function address */
01A1 2F86 MOV R24,R22
01A2 2F97 MOV R25,R23
01A3 9701 SBIW R24,1
01A4 2E28 MOV R2,R24
01A5 2E39 MOV R3,R25
01A6 2D62 MOV R22,R2
01A7 2D73 MOV R23,R3
01A8 2F04 MOV R16,R20
01A9 2F15 MOV R17,R21
01AA D0CD RCALL lpm16
01AB 2E40 MOV R4,R16
01AC 2E51 MOV R5,R17
01AD 2C45 MOV R4,R5
01AE 2455 CLR R5
01AF 2DE2 MOV R30,R2
01B0 2DF3 MOV R31,R3
01B1 8240 STD R4,0+Z
(0041) }
01B2 D0C3 RCALL pop_gset2
01B3 9508 RET
(0042)
(0043) static unsigned int SaveSP; //用于保存需恢复的SP,在OSTickISR或用户中断结束做任务切换时,恢复SP.
(0044)
(0045) //context switch interrupt --- 软中断任务切换
(0046) void OSCtxSw(void)
(0047) {
(0048) asm("PUSH R31\n"
_OSCtxSw:
01B4 93FF PUSH R31
01B5 93EF PUSH R30
01B6 93DF PUSH R29
01B7 93CF PUSH R28
01B8 93BF PUSH R27
01B9 93AF PUSH R26
01BA 920F PUSH R0
01BB 921F PUSH R1
01BC 922F PUSH R2
01BD 923F PUSH R3
01BE 924F PUSH R4
01BF 925F PUSH R5
01C0 B7FD IN R31,P3D
01C1 93F0013B STS R31,_OS_TASK_CrtPrio+1
01C3 B7FE IN R31,P3E
01C4 93F0013C STS R31,_OS_TASK_CrtPrio+2
(0049) "PUSH R30\n"
(0050) "PUSH R29\n"
(0051) "PUSH R28\n"
(0052) "PUSH R27\n"
(0053) "PUSH R26\n"
(0054)
(0055) "PUSH R0\n"
(0056) "PUSH R1\n"
(0057) "PUSH R2\n"
(0058) "PUSH R3\n"
(0059) "PUSH R4\n"
(0060) "PUSH R5\n"
(0061)
(0062) "IN R31,0x3d\n" //Save SPL
(0063) "STS %SaveSP,R31\n"
(0064) "IN R31,0x3e\n" //Save SPH
(0065) "STS %SaveSP+1,R31\n"
(0066)
(0067) );
(0068)
(0069) OSTCB[OS_TASK_CrtPrio].OSStkTop = SaveSP; //Save the current task top.
01C6 9120013A LDS R18,_OS_TASK_CrtPrio
01C8 2733 CLR R19
01C9 E005 LDI R16,5
01CA E010 LDI R17,0
01CB D04E RCALL mpy16s
01CC 2FE0 MOV R30,R16
01CD 2FF1 MOV R31,R17
01CE E280 LDI R24,0x20
01CF E091 LDI R25,1
01D0 0FE8 ADD R30,R24
01D1 1FF9 ADC R31,R25
01D2 9030013C LDS R3,_OS_TASK_CrtPrio+2
01D4 9020013B LDS R2,_OS_TASK_CrtPrio+1
01D6 8220 STD R2,0+Z
01D7 8231 STD R3,1+Z
(0070)
(0071) OS_TASK_CrtPrio=OS_TASK_HighPri;
01D8 90200139 LDS R2,_OS_TASK_HighPri
01DA 9220013A STS R2,_OS_TASK_CrtPrio
(0072)
(0073) // Load context from the stack
(0074) SaveSP = OSTCB[OS_TASK_CrtPrio].OSStkTop; //load the high priority task task top.
01DC 2D22 MOV R18,R2
01DD 2733 CLR R19
01DE E005 LDI R16,5
01DF E010 LDI R17,0
01E0 D039 RCALL mpy16s
01E1 2FE0 MOV R30,R16
01E2 2FF1 MOV R31,R17
01E3 E280 LDI R24,0x20
01E4 E091 LDI R25,1
01E5 0FE8 ADD R30,R24
01E6 1FF9 ADC R31,R25
01E7 8020 LDD R2,0+Z
01E8 8031 LDD R3,1+Z
01E9 9230013C STS R3,_OS_TASK_CrtPrio+2
01EB 9220013B STS R2,_OS_TASK_CrtPrio+1
(0075)
(0076) asm("CLI\n"
01ED 94F8 BCLR 7
01EE 91F0013B LDS R31,_OS_TASK_CrtPrio+1
01F0 BFFD OUT P3D,R31
01F1 91F0013C LDS R31,_OS_TASK_CrtPrio+2
01F3 BFFE OUT P3E,R31
01F4 9478 BSET 7
01F5 905F POP R5
01F6 904F POP R4
01F7 903F POP R3
01F8 902F POP R2
01F9 901F POP R1
01FA 900F POP R0
01FB 91AF POP R26
01FC 91BF POP R27
01FD 91CF POP R28
01FE 91DF POP R29
01FF 91EF POP R30
0200 91FF POP R31
(0077) "LDS R31,%SaveSP\n"
(0078) "OUT 0x3d,R31\n"
(0079) "LDS R31,%SaveSP+1\n"
(0080) "OUT 0x3e,R31\n"
(0081) "SEI\n"
(0082)
(0083) "POP R5\n"
(0084) "POP R4\n"
(0085) "POP R3\n"
(0086) "POP R2\n"
(0087) "POP R1\n"
(0088) "POP R0\n"
(0089)
(0090) "POP R26\n"
(0091) "POP R27\n"
(0092) "POP R28\n"
(0093) "POP R29\n"
(0094) "POP R30\n"
(0095) "POP R31\n"
(0096) );
(0097) }
0201 9508 RET
(0098) //Initial CPU SP for main() function stack.
(0099) void OSInitSP(void)
(0100) {
(0101) SaveSP = (INT16U)&TASK_main_PrioStk[MAX_STK_SIZE-1]; //load the high priority task task top.
_OSInitSP:
0202 E18F LDI R24,0x1F
0203 E091 LDI R25,1
0204 9390013C STS R25,_OS_TASK_CrtPrio+2
0206 9380013B STS R24,_OS_TASK_CrtPrio+1
(0102) asm("POP R0\n"
0208 900F POP R0
0209 901F POP R1
020A 91F0013B LDS R31,_OS_TASK_CrtPrio+1
020C BFFD OUT P3D,R31
020D 91F0013C LDS R31,_OS_TASK_CrtPrio+2
020F BFFE OUT P3E,R31
0210 921F PUSH R1
0211 920F PUSH R0
(0103) "POP R1\n"
(0104) "LDS R31,%SaveSP\n"
(0105) "OUT 0x3d,R31\n"
(0106) "LDS R31,%SaveSP+1\n"
(0107) "OUT 0x3e,R31\n"
(0108) "PUSH R1\n"
(0109) "PUSH R0\n"
(0110) );
(0111) }
0212 9508 RET
_OSTickISR:
0213 D01A RCALL push_lset
(0112)
(0113) //OS Time Tick Interrupt,OS 时钟节拍中断.
(0114) void OSTickISR(void)
(0115) {
(0116) TCNT0 = T0_TCNT0; // (256 - (T0_RELOAD & 0xff))
0214 E78A LDI R24,0x7A
0215 BF82 OUT P32,R24
(0117) AppTickHook(); //Hook file for a time tick --- 用户每个时间节拍的钩子函数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -