📄 minos_avr.lst
字号:
__text_start:
__start:
0010 E5CF LDI R28,0x5F
0011 E0D2 LDI R29,2
0012 BFCD OUT P3D,R28
0013 BFDE OUT P3E,R29
0014 51C0 SUBI R28,0x10
0015 40D0 SBCI R29,0
0016 EA0A LDI R16,0xAA
0017 8308 STD R16,0+Y
0018 2400 CLR R0
0019 E6E0 LDI R30,0x60
001A E0F0 LDI R31,0
001B E011 LDI R17,1
001C 33ED CPI R30,0x3D
001D 07F1 CPC R31,R17
001E F011 BEQ 0x0021
001F 9201 ST R0,Z+
0020 CFFB RJMP 0x001C
0021 8300 STD R16,0+Z
0022 E2E0 LDI R30,0x20
0023 E0F0 LDI R31,0
0024 E6A0 LDI R26,0x60
0025 E0B0 LDI R27,0
0026 E010 LDI R17,0
0027 32E0 CPI R30,0x20
0028 07F1 CPC R31,R17
0029 F021 BEQ 0x002E
002A 95C8 LPM
002B 9631 ADIW R30,1
002C 920D ST R0,X+
002D CFF9 RJMP 0x0027
002E D001 RCALL _main
_exit:
002F CFFF RJMP _exit
_main:
0030 9721 SBIW R28,1
FILE: C:\icc\minOS_iccavr\App.c
(0000) #include "OS_Includes.h"
(0001)
(0002) //PORTB bit4-bit7 for to drive LED1-LED4.
(0003) #define LED1_ON() (PORTB |= (0x1<<4))
(0004) #define LED1_OFF() (PORTB &= ~(0x1<<4))
(0005) #define LED2_ON() (PORTB |= (0x1<<5))
(0006) #define LED2_OFF() (PORTB &= ~(0x1<<5))
(0007) #define LED3_ON() (PORTB |= (0x1<<6))
(0008) #define LED3_OFF() (PORTB &= ~(0x1<<6))
(0009) #define LED4_ON() (PORTB |= (0x1<<7))
(0010) #define LED4_OFF() (PORTB &= ~(0x1<<7))
(0011)
(0012) #define INIT_LED_Drv() (DDRB |= 0xf0) //PORTB bit4-bit7 used to LED1-LED4
(0013)
(0014) void TaskA(void);
(0015) #define TaskAPrio 1 //声明任务TaskA(void)的优先级。
(0016) OS_STK TaskAStk[MAX_STK_SIZE]; //声明任务TaskA(void)的堆栈空间。
(0017) void TaskB(void);
(0018) #define TaskBPrio 2 //声明任务TaskB(void)的优先级。
(0019) OS_STK TaskBStk[MAX_STK_SIZE]; //声明任务TaskB(void)的堆栈空间。
(0020) void TaskC(void);
(0021) #define TaskCPrio 3 //声明任务TaskC(void)的优先级。
(0022) OS_STK TaskCStk[MAX_STK_SIZE]; //声明任务TaskC(void)的堆栈空间。
(0023)
(0024) void main(void)
(0025) {
(0026) OSInitSP();
0031 D1D0 RCALL _OSInitSP
(0027) OSInit(); //初始化OS任务控制块(initialization OSTCB)。
0032 D04E RCALL _OSInit
(0028) OSTaskCreate(TaskA,&TaskAStk[MAX_STK_SIZE],TaskAPrio); //建立任务TaskA(void)。
0033 E081 LDI R24,1
0034 8388 STD R24,0+Y
0035 EF20 LDI R18,0xF0
0036 E030 LDI R19,0
0037 E10E LDI R16,0x1E
0038 E010 LDI R17,0
0039 D133 RCALL _OSTaskCreate
(0029) OSTaskCreate(TaskB,&TaskBStk[MAX_STK_SIZE],TaskBPrio); //建立任务TaskB(void)。
003A E082 LDI R24,2
003B 8388 STD R24,0+Y
003C EC20 LDI R18,0xC0
003D E030 LDI R19,0
003E E10C LDI R16,0x1C
003F E010 LDI R17,0
0040 D12C RCALL _OSTaskCreate
(0030) OSTaskCreate(TaskC,&TaskCStk[MAX_STK_SIZE],TaskCPrio); //建立任务TaskC(void)。
0041 E083 LDI R24,3
0042 8388 STD R24,0+Y
0043 E920 LDI R18,0x90
0044 E030 LDI R19,0
0045 E10A LDI R16,0x1A
0046 E010 LDI R17,0
0047 D125 RCALL _OSTaskCreate
(0031)
(0032) INIT_LED_Drv();
0048 B387 IN R24,P17
0049 6F80 ORI R24,0xF0
004A BB87 OUT P17,R24
(0033)
(0034) OSStart(); //起动OS。
004B D04A RCALL _OSStart
004C C00D RJMP 0x005A
(0035)
(0036) while (1)
(0037) {
(0038) LED1_ON();
004D 9AC4 SBI P18,4
(0039) OSTaskResume(TaskAPrio);
004E E001 LDI R16,1
004F D0EB RCALL _OSTaskResume
(0040) OSTaskSuspend(OS_TASK_Me);
0050 9100013A LDS R16,_OS_TASK_CrtPrio
0052 D0D6 RCALL _OSTaskSuspend
(0041) OSTimeDly(1);
0053 E001 LDI R16,1
0054 E010 LDI R17,0
0055 D0B1 RCALL _OSTimeDly
(0042) LED1_OFF();
0056 98C4 CBI P18,4
(0043) OSTimeDly(1);
0057 E001 LDI R16,1
0058 E010 LDI R17,0
0059 D0AD RCALL _OSTimeDly
(0044) }
005A CFF2 RJMP 0x004D
(0045) }
005B 9621 ADIW R28,1
005C 9508 RET
(0046)
(0047) void TaskA(void)
(0048) {
_TaskA:
005D C00A RJMP 0x0068
(0049) while (1)
(0050) {
(0051) OSTaskResume(Task_main_Prio);
005E 2700 CLR R16
005F D0DB RCALL _OSTaskResume
(0052) // OSTaskSuspend(OS_TASK_Me);
(0053) LED2_ON();
0060 9AC5 SBI P18,5
(0054) OSTimeDly(2);
0061 E002 LDI R16,2
0062 E010 LDI R17,0
0063 D0A3 RCALL _OSTimeDly
(0055) LED2_OFF();
0064 98C5 CBI P18,5
(0056) OSTimeDly(2);
0065 E002 LDI R16,2
0066 E010 LDI R17,0
0067 D09F RCALL _OSTimeDly
(0057) }
0068 CFF5 RJMP 0x005E
(0058) }
0069 9508 RET
(0059)
(0060) void TaskB(void)
(0061) {
_TaskB:
006A C008 RJMP 0x0073
(0062) while (1)
(0063) {
(0064) LED3_ON();
006B 9AC6 SBI P18,6
(0065) OSTimeDly(3);
006C E003 LDI R16,3
006D E010 LDI R17,0
006E D098 RCALL _OSTimeDly
(0066) LED3_OFF();
006F 98C6 CBI P18,6
(0067) OSTimeDly(3);
0070 E003 LDI R16,3
0071 E010 LDI R17,0
0072 D094 RCALL _OSTimeDly
(0068) }
0073 CFF7 RJMP 0x006B
(0069) }
0074 9508 RET
(0070)
(0071) void TaskC(void)
(0072) {
_TaskC:
0075 C008 RJMP 0x007E
(0073) while (1)
(0074) {
(0075) LED4_ON();
0076 9AC7 SBI P18,7
(0076) OSTimeDly(5);
0077 E005 LDI R16,5
0078 E010 LDI R17,0
0079 D08D RCALL _OSTimeDly
(0077) LED4_OFF();
007A 98C7 CBI P18,7
(0078) OSTimeDly(5);
007B E005 LDI R16,5
007C E010 LDI R17,0
007D D089 RCALL _OSTimeDly
(0079) }
007E CFF7 RJMP 0x0076
(0080) }
007F 9508 RET
(0081)
(0082) //hook function for user App --- 时钟节拍回掉函数
(0083) void AppTickHook()
(0084) {
(0085) }
_AppTickHook:
0080 9508 RET
FILE: C:\icc\minOS_iccavr\OS_Core.c
(0000) /*
(0001) *********************************************************************************************************
(0002) * minOS 0.01v
(0003) * The Real-Time OS Kernel
(0004) * All Rights Reserved
(0005) * File : OS_Core.C
(0006) * 作者 : 21icbbs网友 LM7556 ,2004年7月 by : LM7556 , China , 2004-2004
(0007) *
(0008) *********************************************************************************************************
(0009) */
(0010)
(0011)
(0012) #define OS_GLOBALS /* Declare GLOBAL variables */
(0013) #include "OS_Includes.h"
(0014)
(0015) // initialization OSTCB --- 初始化任务控制块.
(0016) void OSInit(void)
(0017) { INT8U i;
(0018) OS_TCB *pOS_TCB;
(0019) pOS_TCB=OSTCB;
_OSInit:
i --> R16
pOS_TCB --> R18
0081 E220 LDI R18,0x20
0082 E031 LDI R19,1
(0020) for (i=0;i<OS_MAX_TASKS;i++,pOS_TCB++)
0083 2700 CLR R16
0084 C00E RJMP 0x0093
(0021) {
(0022) pOS_TCB->OSStkTop=(INT16U)NULL;
0085 2422 CLR R2
0086 2433 CLR R3
0087 2FE2 MOV R30,R18
0088 2FF3 MOV R31,R19
0089 8220 STD R2,0+Z
008A 8231 STD R3,1+Z
(0023) pOS_TCB->OSTaskStatus=OS_TASK_Suspend;
008B EF8D LDI R24,0xFD
008C 8382 STD R24,2+Z
(0024) pOS_TCB->OSTimeDly=0;
008D 2422 CLR R2
008E 8223 STD R2,3+Z
008F 8234 STD R3,4+Z
(0025) }
0090 9503 INC R16
0091 5F2B SUBI R18,0xFB
0092 4F3F SBCI R19,0xFF
0093 3005 CPI R16,5
0094 F380 BCS 0x0085
(0026) }
0095 9508 RET
(0027)
(0028) //Start OS --- 启动OS
(0029) void OSStart(void)
(0030) {
(0031) Init_OS_Timer();
_OSStart:
0096 D0CD RCALL _InitOSTimer
(0032) OS_TASK_CrtPrio=Task_main_Prio;
0097 2422 CLR R2
0098 9220013A STS R2,_OS_TASK_CrtPrio
(0033) OSTCB[OS_TASK_CrtPrio].OSTaskStatus=OS_TASK_Run;
009A 2D22 MOV R18,R2
009B 2733 CLR R19
009C E005 LDI R16,5
009D E010 LDI R17,0
009E D17B RCALL mpy16s
009F 2FE0 MOV R30,R16
00A0 2FF1 MOV R31,R17
00A1 E282 LDI R24,0x22
00A2 E091 LDI R25,1
00A3 0FE8 ADD R30,R24
00A4 1FF9 ADC R31,R25
00A5 EF8B LDI R24,0xFB
00A6 8380 STD R24,0+Z
(0034) OS_INT_ENABLE();
(0035) OS_TASK_INT();
00A7 D10C RCALL _OSCtxSw
(0036) }
00A8 9508 RET
_OSPrioHighRdy:
i --> R16
pOS_TCB --> R18
00A9 D1C9 RCALL push_gset2
(0037)
(0038) //返回优先级最高的处于就绪态任务的优先级,否则返回no_TASK_Rdy。
(0039) static INT8U OSPrioHighRdy(void)
(0040) { INT8U i;
(0041) OS_TCB *pOS_TCB;
(0042) pOS_TCB=OSTCB;
00AA E220 LDI R18,0x20
00AB E031 LDI R19,1
(0043) for (i=0;i<OS_MAX_TASKS;i++,pOS_TCB++)
00AC 2700 CLR R16
00AD C024 RJMP 0x00D2
(0044) {
(0045) if ((pOS_TCB->OSStkTop!=(INT8U)NULL) & (pOS_TCB->OSTaskStatus==OS_TASK_Rdy)) {return i;}
00AE 2FE2 MOV R30,R18
00AF 2FF3 MOV R31,R19
00B0 8020 LDD R2,0+Z
00B1 8031 LDD R3,1+Z
00B2 2022 TST R2
00B3 F411 BNE 0x00B6
00B4 2033 TST R3
00B5 F019 BEQ 0x00B9
00B6 E061 LDI R22,1
00B7 E070 LDI R23,0
00B8 C002 RJMP 0x00BB
00B9 2766 CLR R22
00BA 2777 CLR R23
00BB 2FE2 MOV R30,R18
00BC 2FF3 MOV R31,R19
00BD 8182 LDD R24,2+Z
00BE 3F8C CPI R24,0xFC
00BF F419 BNE 0x00C3
00C0 E041 LDI R20,1
00C1 E050 LDI R21,0
00C2 C002 RJMP 0x00C5
00C3 2744 CLR R20
00C4 2755 CLR R21
00C5 2E26 MOV R2,R22
00C6 2E37 MOV R3,R23
00C7 2224 AND R2,R20
00C8 2235 AND R3,R21
00C9 2022 TST R2
00CA F411 BNE 0x00CD
00CB 2033 TST R3
00CC F011 BEQ 0x00CF
00CD 2711 CLR R17
00CE C007 RJMP 0x00D6
(0046) }
00CF 9503 INC R16
00D0 5F2B SUBI R18,0xFB
00D1 4F3F SBCI R19,0xFF
00D2 3005 CPI R16,5
00D3 F2D0 BCS 0x00AE
(0047) return no_TASK_Rdy;
00D4 EF0F LDI R16,0xFF
00D5 E010 LDI R17,0
00D6 D19F RCALL pop_gset2
00D7 9508 RET
_OSTimeTick:
i --> R20
pOS_TCB --> R22
00D8 D19A RCALL push_gset2
(0048) }
(0049)
(0050) //Task OSTimeDly Decrease 1 per Time Tick --- 每个时钟节拍,任务等待延时的时间OSTimeDly减1.
(0051) //如果任务的OSTimeDly减到0,把任务设置为准备就绪OS_TASK_Rdy。
(0052) void OSTimeTick(void)
(0053) { INT8U i;
(0054) OS_TCB *pOS_TCB;
(0055) pOS_TCB=OSTCB;
00D9 E260 LDI R22,0x20
00DA E071 LDI R23,1
(0056) for (i=0;i<OS_MAX_TASKS;i++,pOS_TCB++)
00DB 2744 CLR R20
00DC C021 RJMP 0x00FE
(0057) {
(0058) if (pOS_TCB->OSTimeDly>OS_TASK_TimeOut)
00DD 2FE6 MOV R30,R22
00DE 2FF7 MOV R31,R23
00DF 8023 LDD R2,3+Z
00E0 8034 LDD R3,4+Z
00E1 2022 TST R2
00E2 F411 BNE 0x00E5
00E3 2033 TST R3
00E4 F0B1 BEQ 0x00FB
(0059) {
(0060) if (--pOS_TCB->OSTimeDly==0) {pOS_TCB->OSTaskStatus=OS_TASK_Rdy;}
00E5 2F86 MOV R24,R22
00E6 2F97 MOV R25,R23
00E7 9603 ADIW R24,3
00E8 2E28 MOV R2,R24
00E9 2E39 MOV R3,R25
00EA 2DE2 MOV R30,R2
00EB 2DF3 MOV R31,R3
00EC 8180 LDD R24,0+Z
00ED 8191 LDD R25,1+Z
00EE 9701 SBIW R24,1
00EF 2E48 MOV R4,R24
00F0 2E59 MOV R5,R25
00F1 8240 STD R4,0+Z
00F2 8251 STD R5,1+Z
00F3 2044 TST R4
00F4 F431 BNE 0x00FB
00F5 2055 TST R5
00F6 F421 BNE 0x00FB
00F7 EF8C LDI R24,0xFC
00F8 2FE6 MOV R30,R22
00F9 2FF7 MOV R31,R23
00FA 8382 STD R24,2+Z
(0061) }
(0062) }
00FB 9543 INC R20
00FC 5F6B SUBI R22,0xFB
00FD 4F7F SBCI R23,0xFF
00FE 3045 CPI R20,5
00FF F2E8 BCS 0x00DD
(0063) OS_TASK_HighPri=OSPrioHighRdy();
0100 DFA8 RCALL _OSPrioHighRdy
0101 2E20 MOV R2,R16
0102 2E31 MOV R3,R17
0103 92200139 STS R2,_OS_TASK_HighPri
(0064) }
0105 D170 RCALL pop_gset2
0106 9508 RET
_OSTimeDly:
Tdly --> R20
0107 D154 RCALL push_gset1
0108 2F40 MOV R20,R16
0109 2F51 MOV R21,R17
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -