📄 main.lss
字号:
main.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 0000171c 00000000 00000000 00000094 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 00000094 00800060 0000171c 000017b0 2**0
CONTENTS, ALLOC, LOAD, DATA
2 .bss 000001d7 008000f4 008000f4 00001844 2**0
ALLOC
3 .noinit 00000000 008002cb 008002cb 00001844 2**0
CONTENTS
4 .eeprom 00000000 00810000 00810000 00001844 2**0
CONTENTS
5 .stab 0000036c 00000000 00000000 00001844 2**2
CONTENTS, READONLY, DEBUGGING
6 .stabstr 00000084 00000000 00000000 00001bb0 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_aranges 00000014 00000000 00000000 00001c34 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_pubnames 000004be 00000000 00000000 00001c48 2**0
CONTENTS, READONLY, DEBUGGING
9 .debug_info 00000e2a 00000000 00000000 00002106 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_abbrev 0000020b 00000000 00000000 00002f30 2**0
CONTENTS, READONLY, DEBUGGING
11 .debug_line 00000ea1 00000000 00000000 0000313b 2**0
CONTENTS, READONLY, DEBUGGING
12 .debug_str 0000051f 00000000 00000000 00003fdc 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00000000 <__vectors>:
0: 0c 94 2a 00 jmp 0x54 <__ctors_end>
4: 0c 94 60 05 jmp 0xac0 <__vector_1>
8: 0c 94 b8 07 jmp 0xf70 <__vector_2>
c: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
10: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
14: 0c 94 9f 06 jmp 0xd3e <__vector_5>
18: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
1c: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
20: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
24: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
28: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
2c: 0c 94 d5 01 jmp 0x3aa <__vector_11>
30: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
34: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
38: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
3c: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
40: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
44: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
48: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
4c: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
50: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
00000054 <__ctors_end>:
54: 11 24 eor r1, r1
56: 1f be out 0x3f, r1 ; 63
58: cf e5 ldi r28, 0x5F ; 95
5a: d8 e0 ldi r29, 0x08 ; 8
5c: de bf out 0x3e, r29 ; 62
5e: cd bf out 0x3d, r28 ; 61
00000060 <__do_copy_data>:
60: 10 e0 ldi r17, 0x00 ; 0
62: a0 e6 ldi r26, 0x60 ; 96
64: b0 e0 ldi r27, 0x00 ; 0
66: ec e1 ldi r30, 0x1C ; 28
68: f7 e1 ldi r31, 0x17 ; 23
6a: 02 c0 rjmp .+4 ; 0x70 <.do_copy_data_start>
0000006c <.do_copy_data_loop>:
6c: 05 90 lpm r0, Z+
6e: 0d 92 st X+, r0
00000070 <.do_copy_data_start>:
70: a4 3f cpi r26, 0xF4 ; 244
72: b1 07 cpc r27, r17
74: d9 f7 brne .-10 ; 0x6c <.do_copy_data_loop>
00000076 <__do_clear_bss>:
76: 12 e0 ldi r17, 0x02 ; 2
78: a4 ef ldi r26, 0xF4 ; 244
7a: b0 e0 ldi r27, 0x00 ; 0
7c: 01 c0 rjmp .+2 ; 0x80 <.do_clear_bss_start>
0000007e <.do_clear_bss_loop>:
7e: 1d 92 st X+, r1
00000080 <.do_clear_bss_start>:
80: ab 3c cpi r26, 0xCB ; 203
82: b1 07 cpc r27, r17
84: e1 f7 brne .-8 ; 0x7e <.do_clear_bss_loop>
86: 0c 94 33 0a jmp 0x1466 <main>
0000008a <__bad_interrupt>:
8a: 0c 94 00 00 jmp 0x0 <__vectors>
0000008e <OSTaskCreate>:
** 功 能: 初始化任务堆栈
--------------------------------------------------------
*******************************************************/
void OSTaskCreate(void (*Task)(void),unsigned char *Stack,unsigned char TaskID)
{
8e: db 01 movw r26, r22
unsigned char i;
*Stack--=(unsigned int)Task; //将任务的地址低位压入堆栈,
90: 8c 93 st X, r24
*Stack--=(unsigned int)Task>>8; //将任务的地址高位压入堆栈,
92: 89 2f mov r24, r25
94: 99 27 eor r25, r25
96: 8e 93 st -X, r24
*Stack--=0x00; //R1 __zero_reg__
98: 1e 92 st -X, r1
*Stack--=0x00; //R0 __tmp_reg__
9a: 1e 92 st -X, r1
*Stack--=0x80;
9c: 80 e8 ldi r24, 0x80 ; 128
9e: 8e 93 st -X, r24
a0: 11 97 sbiw r26, 0x01 ; 1
//SREG 在任务中,开启全局中断
for(i=0;i<14;i++) //在 avr-libc 中的 FAQ中的 What registers are used by the C compiler?
a2: 80 e0 ldi r24, 0x00 ; 0
*Stack--=i; //描述了寄存器的作用
a4: 8c 93 st X, r24
a6: 11 97 sbiw r26, 0x01 ; 1
a8: 8f 5f subi r24, 0xFF ; 255
aa: 8e 30 cpi r24, 0x0E ; 14
ac: d8 f3 brcs .-10 ; 0xa4 <OSTaskCreate+0x16>
TCB[TaskID].OSTaskStackTop=(unsigned int)Stack; //将人工堆栈的栈顶,保存到堆栈的数组中
ae: 84 2f mov r24, r20
b0: 99 27 eor r25, r25
b2: fc 01 movw r30, r24
b4: ee 0f add r30, r30
b6: ff 1f adc r31, r31
b8: ee 0f add r30, r30
ba: ff 1f adc r31, r31
bc: eb 5f subi r30, 0xFB ; 251
be: fe 4f sbci r31, 0xFE ; 254
c0: b1 83 std Z+1, r27 ; 0x01
c2: a0 83 st Z, r26
OSRdyTbl|=0x01<<TaskID; //任务就绪表已经准备好
c4: 21 e0 ldi r18, 0x01 ; 1
c6: 30 e0 ldi r19, 0x00 ; 0
c8: 02 c0 rjmp .+4 ; 0xce <OSTaskCreate+0x40>
ca: 22 0f add r18, r18
cc: 33 1f adc r19, r19
ce: 8a 95 dec r24
d0: e2 f7 brpl .-8 ; 0xca <OSTaskCreate+0x3c>
d2: 22 2a or r2, r18
d4: 08 95 ret
000000d6 <OSStartTask>:
}
/*******************************************************
** 函数名: OSStartTask()
** 子函数: 无
** 输 入: 无
** 输 出: 无
** 功 能: 开始任务调度,从最低优先级的任务的开始
--------------------------------------------------------
*******************************************************/
//
void OSStartTask(void)
{
OSTaskRunningPrio=OS_TASKS;
d6: 34 e0 ldi r19, 0x04 ; 4
d8: 33 2e mov r3, r19
SP=TCB[OS_TASKS].OSTaskStackTop+17;
da: 80 91 15 01 lds r24, 0x0115
de: 90 91 16 01 lds r25, 0x0116
e2: 41 96 adiw r24, 0x11 ; 17
e4: 9e bf out 0x3e, r25 ; 62
e6: 8d bf out 0x3d, r24 ; 61
__asm__ __volatile__( "reti" " \
e8: 18 95 reti
ea: 08 95 ret
000000ec <OSSched>:
\t" );
}
/*******************************************************
** 函数名: OSSched()
** 子函数: 无
** 输 入: 无
** 输 出: 无
** 功 能: 进行任务调度,SP是指向堆栈的指针,在该任务要改变
--------------------------------------------------------
*******************************************************/
void OSSched(void)
{
__asm__ __volatile__("LDI R16,0x01 \
ec: 01 e0 ldi r16, 0x01 ; 1
\t");
//清除中断要求任务切换的标志位,设置正在任务切换标志位
__asm__ __volatile__("SEI \
ee: 78 94 sei
\t");
//开中断,因为如果因中断在任务调度中进行,要重新进行调度时,已经关中断
//根据中断时保存寄存器的次序入栈,模拟一次中断后,入栈的情况
__asm__ __volatile__("PUSH __zero_reg__ \
f0: 1f 92 push r1
\t"); //R1
__asm__ __volatile__("PUSH __tmp_reg__ \
f2: 0f 92 push r0
\t"); //R0
__asm__ __volatile__("IN __tmp_reg__,__SREG__ \
f4: 0f b6 in r0, 0x3f ; 63
\t"); //保存状态寄存器SREG
__asm__ __volatile__("PUSH __tmp_reg__ \
f6: 0f 92 push r0
\t");
__asm__ __volatile__("CLR __zero_reg__ \
f8: 11 24 eor r1, r1
\t"); //R0重新清零
__asm__ __volatile__("PUSH R18 \
fa: 2f 93 push r18
\t");
__asm__ __volatile__("PUSH R19 \
fc: 3f 93 push r19
\t");
__asm__ __volatile__("PUSH R20 \
fe: 4f 93 push r20
\t");
__asm__ __volatile__("PUSH R21 \
100: 5f 93 push r21
\t");
__asm__ __volatile__("PUSH R22 \
102: 6f 93 push r22
\t");
__asm__ __volatile__("PUSH R23 \
104: 7f 93 push r23
\t");
__asm__ __volatile__("PUSH R24 \
106: 8f 93 push r24
\t");
__asm__ __volatile__("PUSH R25 \
108: 9f 93 push r25
\t");
__asm__ __volatile__("PUSH R26 \
10a: af 93 push r26
\t");
__asm__ __volatile__("PUSH R27 \
10c: bf 93 push r27
\t");
__asm__ __volatile__("PUSH R30 \
10e: ef 93 push r30
\t");
__asm__ __volatile__("PUSH R31 \
110: ff 93 push r31
00000112 <Int_OSSched>:
\t");
__asm__ __volatile__("Int_OSSched: \
\t"); //当中断要求调度,直接进入这里
__asm__ __volatile__("SEI \
112: 78 94 sei
\t");
//开中断,因为如果因中断在任务调度中进行,已经关中断
__asm__ __volatile__("PUSH R28 \
114: cf 93 push r28
\t"); //R28与R29用于建立在堆栈上的指针
__asm__ __volatile__("PUSH R29 \
116: df 93 push r29
\t"); //入栈完成
TCB[OSTaskRunningPrio].OSTaskStackTop=SP; //将正在运行的任务的堆栈底保存
118: e3 2d mov r30, r3
11a: ff 27 eor r31, r31
11c: ee 0f add r30, r30
11e: ff 1f adc r31, r31
120: ee 0f add r30, r30
122: ff 1f adc r31, r31
124: eb 5f subi r30, 0xFB ; 251
126: fe 4f sbci r31, 0xFE ; 254
128: 8d b7 in r24, 0x3d ; 61
12a: 9e b7 in r25, 0x3e ; 62
12c: 91 83 std Z+1, r25 ; 0x01
12e: 80 83 st Z, r24
unsigned char OSNextTaskPrio; //在现有堆栈上开设新的空间
for (OSNextTaskPrio = 0; //进行任务调度
130: 40 e0 ldi r20, 0x00 ; 0
132: 22 2d mov r18, r2
134: 33 27 eor r19, r19
136: 20 fd sbrc r18, 0
138: 0c c0 rjmp .+24 ; 0x152 <Int_OSSched+0x40>
13a: 4f 5f subi r20, 0xFF ; 255
13c: 44 30 cpi r20, 0x04 ; 4
13e: 48 f4 brcc .+18 ; 0x152 <Int_OSSched+0x40>
140: c9 01 movw r24, r18
142: 04 2e mov r0, r20
144: 02 c0 rjmp .+4 ; 0x14a <Int_OSSched+0x38>
146: 95 95 asr r25
148: 87 95 ror r24
14a: 0a 94 dec r0
14c: e2 f7 brpl .-8 ; 0x146 <Int_OSSched+0x34>
14e: 80 ff sbrs r24, 0
150: f4 cf rjmp .-24 ; 0x13a <Int_OSSched+0x28>
OSNextTaskPrio < OS_TASKS && !(OSRdyTbl & (0x01<<OSNextTaskPrio));
OSNextTaskPrio++);
OSTaskRunningPrio = OSNextTaskPrio ;
152: 34 2e mov r3, r20
cli(); //保护堆栈转换
154: f8 94 cli
SP=TCB[OSTaskRunningPrio].OSTaskStackTop; //将将要运行的任务的堆栈底赋给SP
156: e4 2f mov r30, r20
158: ff 27 eor r31, r31
15a: ee 0f add r30, r30
15c: ff 1f adc r31, r31
15e: ee 0f add r30, r30
160: ff 1f adc r31, r31
162: eb 5f subi r30, 0xFB ; 251
164: fe 4f sbci r31, 0xFE ; 254
166: 80 81 ld r24, Z
168: 91 81 ldd r25, Z+1 ; 0x01
16a: 9e bf out 0x3e, r25 ; 62
16c: 8d bf out 0x3d, r24 ; 61
sei();
16e: 78 94 sei
//根据中断时的出栈次序
__asm__ __volatile__("POP R29 \
170: df 91 pop r29
\t");
__asm__ __volatile__("POP R28 \
172: cf 91 pop r28
\t");
__asm__ __volatile__("POP R31 \
174: ff 91 pop r31
\t");
__asm__ __volatile__("POP R30 \
176: ef 91 pop r30
\t");
__asm__ __volatile__("POP R27 \
178: bf 91 pop r27
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -