📄 project.lst
字号:
__text_start:
__start:
0032 E5CF LDI R28,0x5F
0033 E0D4 LDI R29,4
0034 BFCD OUT 0x3D,R28
0035 BFDE OUT 0x3E,R29
0036 51C0 SUBI R28,0x10
0037 40D0 SBCI R29,0
0038 EA0A LDI R16,0xAA
0039 8308 STD Y+0,R16
003A 2400 CLR R0
003B E7E0 LDI R30,0x70
003C E0F0 LDI R31,0
003D E010 LDI R17,0
003E 38E8 CPI R30,0x88
003F 07F1 CPC R31,R17
0040 F011 BEQ 0x0043
0041 9201 ST R0,Z+
0042 CFFB RJMP 0x003E
0043 8300 STD Z+0,R16
0044 E5E4 LDI R30,0x54
0045 E0F0 LDI R31,0
0046 E6A0 LDI R26,0x60
0047 E0B0 LDI R27,0
0048 E010 LDI R17,0
0049 36E4 CPI R30,0x64
004A 07F1 CPC R31,R17
004B F021 BEQ 0x0050
004C 95C8 LPM
004D 9631 ADIW R30,1
004E 920D ST R0,X+
004F CFF9 RJMP 0x0049
0050 940E014C CALL _main
_exit:
0052 CFFF RJMP _exit
FILE: E:\Steaven2000\AVR\AVR_Book\PROGRA~1\SOURCE~1\Code\多任务模拟系统设计\initial.c
(0001) //***************************************************************
(0002) // File Name : Gpio.c
(0003) // Author : Steaven
(0004) // Created : 2008-06-09
(0005) // Modified :
(0006) // Revision : V0.0
(0007) //***************************************************************
(0008)
(0009) #include "app.h"
(0010)
(0011) //local function(s) declaration
(0012) void Gpio_Init(void);
(0013) void Timer2_Init(void);
(0014) void Interrupt_Init(void);
(0015)
(0016) //***************************************************************
(0017) // Function : Hardware_Init
(0018) // Input : none
(0019) // Output : none
(0020) // Description : ATmega16 Hardware Initialization
(0021) //***************************************************************
(0022) void Hardware_Init(void)
(0023) {
(0024) Gpio_Init();
_Hardware_Init:
0053 D002 RCALL _Gpio_Init
(0025) Timer2_Init();
0054 D00E RCALL _Timer2_Init
(0026) Interrupt_Init();
(0027) }
0055 C01B RJMP _Interrupt_Init
(0028)
(0029) //***************************************************************
(0030) // Function : Gpio_Init
(0031) // Input : none
(0032) // Output : none
(0033) // Description : ATmega16 GPIO Initialization
(0034) //***************************************************************
(0035) void Gpio_Init(void)
(0036) {
(0037) DDRB &= 0xF0; //Key1~Key4,GPIO input
_Gpio_Init:
0056 B387 IN R24,0x17
0057 7F80 ANDI R24,0xF0
0058 BB87 OUT 0x17,R24
(0038) PORTB &= 0xF0; //Key1~Key4,GPIO no pull-up
0059 B388 IN R24,0x18
005A 7F80 ANDI R24,0xF0
005B BB88 OUT 0x18,R24
(0039) DDRD |= 0xF0; //LED1~LED4,GPIO output
005C B381 IN R24,0x11
005D 6F80 ORI R24,0xF0
005E BB81 OUT 0x11,R24
(0040) PORTB &= 0x0F; //LED1~LED4,Gpio output 'L'
005F B388 IN R24,0x18
0060 708F ANDI R24,0xF
0061 BB88 OUT 0x18,R24
(0041) }
0062 9508 RET
(0042)
(0043) //***************************************************************
(0044) // Function : Timer_Init
(0045) // Input : none
(0046) // Output : none
(0047) // Description : ATmega16 Timer Initialization
(0048) //***************************************************************
(0049) void Timer2_Init(void)
(0050) {
(0051) ASSR = 0x00; //Timer2 clocked by sys clk
_Timer2_Init:
0063 2422 CLR R2
0064 BC22 OUT 0x22,R2
(0052) TCCR2 = 0x47; //1024 division,8M/1024,CTC Mode
0065 E487 LDI R24,0x47
0066 BD85 OUT 0x25,R24
(0053) TCNT2 = 0x00; //Clear Counter
0067 BC24 OUT 0x24,R2
(0054) OCR2 = 78; //78 * 1024/8M = 10ms
0068 E48E LDI R24,0x4E
0069 BD83 OUT 0x23,R24
(0055) TIMSK |= 0x80; //Enable OCIE2
006A B789 IN R24,0x39
006B 6880 ORI R24,0x80
006C BF89 OUT 0x39,R24
(0056) TIFR |= 0x80; //Clear OCIF2
006D B788 IN R24,0x38
006E 6880 ORI R24,0x80
006F BF88 OUT 0x38,R24
(0057) }
0070 9508 RET
(0058)
(0059) //***************************************************************
(0060) // Function : Interrupt_Init
(0061) // Input : none
(0062) // Output : none
(0063) // Description : ATmega16 Interrupt Initialization
(0064) //***************************************************************
(0065) void Interrupt_Init(void)
(0066) {
(0067) SREG |= 0x80; //Enable Global Interrupt
_Interrupt_Init:
0071 9478 BSET 7
(0068) }
0072 9508 RET
_Timer2_Interrupt:
0073 940E03F1 CALL push_lset
FILE: E:\Steaven2000\AVR\AVR_Book\PROGRA~1\SOURCE~1\Code\多任务模拟系统设计\interrupt.c
(0001) //***************************************************************
(0002) // File Name : Interrupt.c
(0003) // Author : Steaven
(0004) // Created : 2008-06-09
(0005) // Modified :
(0006) // Revision : V0.0
(0007) //***************************************************************
(0008)
(0009) #include "app.h"
(0010)
(0011) //***************************************************************
(0012) // Function : Timer2_Interrupt
(0013) // Input : none
(0014) // Output : none
(0015) // Description : Kernel Clock Interrupt Service Routine
(0016) //***************************************************************
(0017) #pragma interrupt_handler Timer2_Interrupt:4
(0018) void Timer2_Interrupt(void)
(0019) {
(0020) //Clear Timer2 OCIF Flag
(0021) TIFR |= 0x80;
0075 B788 IN R24,0x38
0076 6880 ORI R24,0x80
0077 BF88 OUT 0x38,R24
(0022) TCNT2 = 0x00;
0078 2422 CLR R2
0079 BC24 OUT 0x24,R2
(0023) //Key Detection
(0024) Key_Detection();
007A 940E028B CALL _Key_Detection
(0025) //Update Task Status
(0026) OS_Task_Update();
007C 940E00EB CALL _OS_Task_Update
(0027) }
007E 940E0408 CALL pop_lset
0080 9518 RETI
_OS_Event_Pend:
wTaskEvent --> R20
bTaskPrio --> R16
0081 940E03D6 CALL push_gset1
FILE: E:\Steaven2000\AVR\AVR_Book\PROGRA~1\SOURCE~1\Code\多任务模拟系统设计\Kernel.c
(0001) //******************************************************************************
(0002) // File Name : main.c
(0003) // Author : Steaven
(0004) // Created : 2008-06-09
(0005) // Modified :
(0006) // Revision : V0.0
(0007) //******************************************************************************
(0008)
(0009) #include "App.h"
(0010)
(0011) //Task Control Block structure
(0012) typedef struct
(0013) {
(0014) INT16U wTimerPeriod;
(0015) INT16U wTimerCount;
(0016) INT16U wEvent;
(0017) }OS_TCB;
(0018)
(0019) //structure array definition
(0020) OS_TCB OSTCB[cMaxTask];
(0021)
(0022) //******************************************************************************
(0023) // Function : OS_Event_Pend
(0024) // Input : wTaskPrio - priority of task
(0025) // Output : event of task
(0026) // Description : Inquiry event of task indexed by priority and then clear it
(0027) //******************************************************************************
(0028) INT16U OS_Event_Pend(INT8U bTaskPrio)
(0029) {
(0030) INT16U wTaskEvent;
(0031) wTaskEvent = OSTCB[bTaskPrio].wEvent;
0083 E086 LDI R24,6
0084 9F80 MUL R24,R16
0085 01F0 MOVW R30,R0
0086 E784 LDI R24,0x74
0087 E090 LDI R25,0
0088 0FE8 ADD R30,R24
0089 1FF9 ADC R31,R25
008A 8140 LDD R20,Z+0
008B 8151 LDD R21,Z+1
(0032) OSTCB[bTaskPrio].wEvent &= ~wTaskEvent;
008C E086 LDI R24,6
008D 9F80 MUL R24,R16
008E 0110 MOVW R2,R0
008F E784 LDI R24,0x74
0090 E090 LDI R25,0
0091 0E28 ADD R2,R24
0092 1E39 ADC R3,R25
0093 012A MOVW R4,R20
0094 9440 COM R4
0095 9450 COM R5
0096 01F1 MOVW R30,R2
0097 8060 LDD R6,Z+0
0098 8071 LDD R7,Z+1
0099 2064 AND R6,R4
009A 2075 AND R7,R5
009B 8271 STD Z+1,R7
009C 8260 STD Z+0,R6
(0033) return(wTaskEvent);
009D 018A MOVW R16,R20
009E 940E03D9 CALL pop_gset1
00A0 9508 RET
_OS_Event_Post:
wTaskEvent --> R20
bTaskPrio --> R22
00A1 940E03ED CALL push_gset2
00A3 01A9 MOVW R20,R18
00A4 2F60 MOV R22,R16
(0034) }
(0035)
(0036) //******************************************************************************
(0037) // Function : OSEventSend
(0038) // Input : wTaskPrio - priority of task
(0039) // wTaskEvent - event to be sent
(0040) // Output : none
(0041) // Description : Send an event to task indexed by priority
(0042) //******************************************************************************
(0043) void OS_Event_Post(INT8U bTaskPrio,INT16U wTaskEvent)
(0044) {
(0045) OSTCB[bTaskPrio].wEvent |= (1 << wTaskEvent);
00A5 E086 LDI R24,6
00A6 9F86 MUL R24,R22
00A7 0110 MOVW R2,R0
00A8 E784 LDI R24,0x74
00A9 E090 LDI R25,0
00AA 0E28 ADD R2,R24
00AB 1E39 ADC R3,R25
00AC E001 LDI R16,1
00AD E010 LDI R17,0
00AE 019A MOVW R18,R20
00AF 940E041F CALL lsl16
00B1 01F1 MOVW R30,R2
00B2 8040 LDD R4,Z+0
00B3 8051 LDD R5,Z+1
00B4 2A40 OR R4,R16
00B5 2A51 OR R5,R17
00B6 8251 STD Z+1,R5
00B7 8240 STD Z+0,R4
(0046) }
00B8 940E03D3 CALL pop_gset2
00BA 9508 RET
(0047)
(0048) //******************************************************************************
(0049) // Function : OS_Task_Create
(0050) // Input : wTaskPrio - priority of task
(0051) // wTimerPeriod - period of task
(0052) // Output : none
(0053) // Description : Set time period of a task to create it
(0054) //******************************************************************************
(0055) void OS_Task_Create(INT8U bTaskPrio,INT16U wTimerPeriod)
(0056) {
(0057) OSTCB[bTaskPrio].wTimerPeriod = wTimerPeriod;
_OS_Task_Create:
wTimerPeriod --> R18
bTaskPrio --> R16
00BB E086 LDI R24,6
00BC 9F80 MUL R24,R16
00BD 01F0 MOVW R30,R0
00BE E780 LDI R24,0x70
00BF E090 LDI R25,0
00C0 0FE8 ADD R30,R24
00C1 1FF9 ADC R31,R25
00C2 8331 STD Z+1,R19
00C3 8320 STD Z+0,R18
(0058) }
00C4 9508 RET
(0059)
(0060) //******************************************************************************
(0061) // Function : OS_Task_Start
(0062) // Input : wTaskPrio - priority of task
(0063) // wTimerCount - Initial time count of a task
(0064) // Output : none
(0065) // Description : Set initial time count of a task
(0066) //******************************************************************************
(0067) void OS_Task_Init(INT8U bTaskPrio,INT16U wTimerCount)
(0068) {
(0069) OSTCB[bTaskPrio].wTimerCount = wTimerCount;
_OS_Task_Init:
wTimerCount --> R18
bTaskPrio --> R16
00C5 E086 LDI R24,6
00C6 9F80 MUL R24,R16
00C7 01F0 MOVW R30,R0
00C8 E782 LDI R24,0x72
00C9 E090 LDI R25,0
00CA 0FE8 ADD R30,R24
00CB 1FF9 ADC R31,R25
00CC 8331 STD Z+1,R19
00CD 8320 STD Z+0,R18
(0070) }
00CE 9508 RET
_OS_Task_Switch:
bTemp --> R20
bTaskPrio --> R16
00CF 940E03D6 CALL push_gset1
(0071)
(0072) //******************************************************************************
(0073) // Function : OS_Task_Switch
(0074) // Input : wTaskPrio - priority of task
(0075) // Output : none
(0076) // Description : inquiry the task in ready status.if there's no ready task with
(0077) // priority higher than current one,the task would run
(0078) //******************************************************************************
(0079) INT16U OS_Task_Switch(INT8U bTaskPrio)
(0080) {
(0081) INT8U bTemp;
(0082) for(bTemp = 0;bTemp < bTaskPrio;bTemp++)
00D1 2744 CLR R20
00D2 C011 RJMP 0x00E4
(0083) {
(0084) if(OSTCB[bTemp].wEvent != 0)
00D3 E086 LDI R24,6
00D4 9F84 MUL R24,R20
00D5 01F0 MOVW R30,R0
00D6 E784 LDI R24,0x74
00D7 E090 LDI R25,0
00D8 0FE8 ADD R30,R24
00D9 1FF9 ADC R31,R25
00DA 8020 LDD R2,Z+0
00DB 8031 LDD R3,Z+1
00DC 2022 TST R2
00DD F411 BNE 0x00E0
00DE 2033 TST R3
00DF F019 BEQ 0x00E3
(0085) {
(0086) return(true);
00E0 E001 LDI R16,1
00E1 E010 LDI R17,0
00E2 C005 RJMP 0x00E8
00E3 9543 INC R20
00E4 1740 CP R20,R16
00E5 F368 BCS 0x00D3
(0087) }
(0088) }
(0089) return(false);
00E6 2700 CLR R16
00E7 2711 CLR R17
00E8 940E03D9 CALL pop_gset1
00EA 9508 RET
_OS_Task_Update:
bTemp --> R20
00EB 940E03D6 CALL push_gset1
(0090) }
(0091)
(0092) //******************************************************************************
(0093) // Function : OS_Task_Update
(0094) // Input : none
(0095) // Output : none
(0096) // Description : increase timercount of all tasks in each SYS clock ISR.if task
(0097) // is timeout,Kernel send a timer event to the task
(0098) //******************************************************************************
(0099) void OS_Task_Update(void)
(0100) {
(0101) INT8U bTemp;
(0102) for(bTemp = 0;bTemp < cMaxTask;bTemp++)
00ED 2744 CLR R20
00EE C030 RJMP 0x011F
(0103) {
(0104) OSTCB[bTemp].wTimerCount++;
00EF E086 LDI R24,6
00F0 9F84 MUL R24,R20
00F1 0110 MOVW R2,R0
00F2 E782 LDI R24,0x72
00F3 E090 LDI R25,0
00F4 0E28 ADD R2,R24
00F5 1E39 ADC R3,R25
00F6 01F1 MOVW R30,R2
00F7 8180 LDD R24,Z+0
00F8 8191 LDD R25,Z+1
00F9 9601 ADIW R24,1
00FA 8391 STD Z+1,R25
00FB 8380 STD Z+0,R24
(0105) if(OSTCB[bTemp].wTimerCount == OSTCB[bTemp].wTimerPeriod)
00FC E086 LDI R24,6
00FD 9F84 MUL R24,R20
00FE E780 LDI R24,0x70
00FF E090 LDI R25,0
0100 01F0 MOVW R30,R0
0101 0FE8 ADD R30,R24
0102 1FF9 ADC R31,R25
0103 8020 LDD R2,Z+0
0104 8031 LDD R3,Z+1
0105 E782 LDI R24,0x72
0106 E090 LDI R25,0
0107 01F0 MOVW R30,R0
0108 0FE8 ADD R30,R24
0109 1FF9 ADC R31,R25
010A 8040 LDD R4,Z+0
010B 8051 LDD R5,Z+1
010C 1442 CP R4,R2
010D 0453 CPC R5,R3
010E F479 BNE 0x011E
(0106) {
(0107) OSTCB[bTemp].wTimerCount = 0;
010F E086 LDI R24,6
0110 9F84 MUL R24,R20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -