📄 test.lss
字号:
test.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 000005aa 00000000 00000000 00000094 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 00000000 00800060 000005aa 0000063e 2**0
CONTENTS, ALLOC, LOAD, DATA
2 .bss 000001c2 00800060 00800060 0000063e 2**0
ALLOC
3 .noinit 00000000 00800222 00800222 0000063e 2**0
CONTENTS
4 .eeprom 00000000 00810000 00810000 0000063e 2**0
CONTENTS
5 .debug_aranges 00000014 00000000 00000000 0000063e 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_pubnames 00000181 00000000 00000000 00000652 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_info 00000596 00000000 00000000 000007d3 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_abbrev 000001a4 00000000 00000000 00000d69 2**0
CONTENTS, READONLY, DEBUGGING
9 .debug_line 00000579 00000000 00000000 00000f0d 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_str 00000296 00000000 00000000 00001486 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00000000 <__vectors>:
0: 0c 94 2a 00 jmp 0x54
4: 0c 94 45 00 jmp 0x8a
8: 0c 94 45 00 jmp 0x8a
c: 0c 94 45 00 jmp 0x8a
10: 0c 94 45 00 jmp 0x8a
14: 0c 94 45 00 jmp 0x8a
18: 0c 94 45 00 jmp 0x8a
1c: 0c 94 45 00 jmp 0x8a
20: 0c 94 45 00 jmp 0x8a
24: 0c 94 45 00 jmp 0x8a
28: 0c 94 45 00 jmp 0x8a
2c: 0c 94 45 00 jmp 0x8a
30: 0c 94 45 00 jmp 0x8a
34: 0c 94 45 00 jmp 0x8a
38: 0c 94 45 00 jmp 0x8a
3c: 0c 94 45 00 jmp 0x8a
40: 0c 94 45 00 jmp 0x8a
44: 0c 94 45 00 jmp 0x8a
48: 0c 94 45 00 jmp 0x8a
4c: 0c 94 45 00 jmp 0x8a
50: 0c 94 45 00 jmp 0x8a
00000054 <__ctors_end>:
54: 11 24 eor r1, r1
56: 1f be out 0x3f, r1 ; 63
58: cf e5 ldi r28, 0x5F ; 95
5a: d4 e0 ldi r29, 0x04 ; 4
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: ea ea ldi r30, 0xAA ; 170
68: f5 e0 ldi r31, 0x05 ; 5
6a: 02 c0 rjmp .+4 ; 0x70
0000006c <.do_copy_data_loop>:
6c: 05 90 lpm r0, Z+
6e: 0d 92 st X+, r0
00000070 <.do_copy_data_start>:
70: a0 36 cpi r26, 0x60 ; 96
72: b1 07 cpc r27, r17
74: d9 f7 brne .-10 ; 0x6c
00000076 <__do_clear_bss>:
76: 12 e0 ldi r17, 0x02 ; 2
78: a0 e6 ldi r26, 0x60 ; 96
7a: b0 e0 ldi r27, 0x00 ; 0
7c: 01 c0 rjmp .+2 ; 0x80
0000007e <.do_clear_bss_loop>:
7e: 1d 92 st X+, r1
00000080 <.do_clear_bss_start>:
80: a2 32 cpi r26, 0x22 ; 34
82: b1 07 cpc r27, r17
84: e1 f7 brne .-8 ; 0x7e
86: 0c 94 b3 02 jmp 0x566
0000008a <__bad_interrupt>:
8a: 0c 94 00 00 jmp 0x0
0000008e <OSTaskCreate>:
创建时间: 2007年3月3日
修改时间:
************************************************************************************************************************/
void OSTaskCreate(void (*Task)(void),Uint_8bit *Stack,Uint_8bit TaskID)
{
8e: db 01 movw r26, r22
Uint_8bit i;
*Stack--=(Uint_16bit)Task; /*将任务的地址低位压入堆栈 */
90: 8c 93 st X, r24
*Stack--=(Uint_16bit)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; /*SREG 在任务中,开启全局中断 */
9c: 80 e8 ldi r24, 0x80 ; 128
9e: 8e 93 st -X, r24
a0: 11 97 sbiw r26, 0x01 ; 1
for(i=0;i<14;i++)
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
/*
在 avr-libc 中的 FAQ中的 What registers are used by the C compiler?
描述了寄存器的作用
*/
TCB[TaskID].OSTaskStackTop = (Uint_16bit)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: e8 0f add r30, r24
be: f9 1f adc r31, r25
c0: e0 5a subi r30, 0xA0 ; 160
c2: ff 4f sbci r31, 0xFF ; 255
c4: a0 83 st Z, r26
c6: b1 83 std Z+1, r27 ; 0x01
/*
将人工堆栈的栈顶,保存到堆栈的数组中
*/
OSRdyTbl |= 0x01<<TaskID; /*任务就绪表已经准备好 */
c8: 21 e0 ldi r18, 0x01 ; 1
ca: 30 e0 ldi r19, 0x00 ; 0
cc: 02 c0 rjmp .+4 ; 0xd2
ce: 22 0f add r18, r18
d0: 33 1f adc r19, r19
d2: 8a 95 dec r24
d4: e2 f7 brpl .-8 ; 0xce
d6: 22 2a or r2, r18
d8: 08 95 ret
000000da <OSStartTask>:
}
/************************************************************************************************************************
函数名称: OSStartTask
函数原型: void OSStartTask(void)
函数功能: 开始任务调度,从空闲任务开始运行
入口参数: 无
出口参数: 无
有关说明: 执行"reti"指令之后打开全局中断
创建时间: 2007年3月3日
修改时间:
************************************************************************************************************************/
void OSStartTask(void)
{
OSPrioCur = OS_TASKS;
da: 43 e0 ldi r20, 0x03 ; 3
dc: 34 2e mov r3, r20
OSPrioHighRdy = OS_TASKS;
de: 53 2c mov r5, r3
SP=TCB[OS_TASKS].OSTaskStackTop+17;
e0: 80 91 6f 00 lds r24, 0x006F
e4: 90 91 70 00 lds r25, 0x0070
e8: 41 96 adiw r24, 0x11 ; 17
ea: 9e bf out 0x3e, r25 ; 62
ec: 8d bf out 0x3d, r24 ; 61
__asm__ __volatile__( "reti" "\n\t" );
ee: 18 95 reti
f0: 08 95 ret
000000f2 <OS_TASK_SW>:
}
/************************************************************************************************************************
函数名称: OS_TASK_SW
函数原型: void OS_TASK_SW(void)
函数功能: 进行任务调度
入口参数: 无
出口参数: 无
有关说明: 中断和任务都可以调用这个任务调度函数
创建时间: 2007年3月3日
修改时间:
************************************************************************************************************************/
void OS_TASK_SW(void)
{
__asm__ __volatile__("LDI R16,0x01 \n\t");
f2: 01 e0 ldi r16, 0x01 ; 1
/*
清除中断要求任务切换的标志位,设置正在任务切换标志位
*/
__asm__ __volatile__("SEI \n\t");
f4: 78 94 sei
/*
开中断,因为如果因中断在任务调度中进行,要重新进行调度时,已经关中断
*/
/* 根据中断时保存寄存器的次序入栈,模拟一次中断后,入栈的情况*/
__asm__ __volatile__("PUSH __zero_reg__ \n\t"); /*R1 */
f6: 1f 92 push r1
__asm__ __volatile__("PUSH __tmp_reg__ \n\t"); /*R0 */
f8: 0f 92 push r0
__asm__ __volatile__("IN __tmp_reg__,__SREG__ \n\t"); /*保存状态寄存器SREG */
fa: 0f b6 in r0, 0x3f ; 63
__asm__ __volatile__("PUSH __tmp_reg__ \n\t");
fc: 0f 92 push r0
__asm__ __volatile__("CLR __zero_reg__ \n\t"); /*R0重新清零 */
fe: 11 24 eor r1, r1
__asm__ __volatile__("PUSH R18 \n\t");
100: 2f 93 push r18
__asm__ __volatile__("PUSH R19 \n\t");
102: 3f 93 push r19
__asm__ __volatile__("PUSH R20 \n\t");
104: 4f 93 push r20
__asm__ __volatile__("PUSH R21 \n\t");
106: 5f 93 push r21
__asm__ __volatile__("PUSH R22 \n\t");
108: 6f 93 push r22
__asm__ __volatile__("PUSH R23 \n\t");
10a: 7f 93 push r23
__asm__ __volatile__("PUSH R24 \n\t");
10c: 8f 93 push r24
__asm__ __volatile__("PUSH R25 \n\t");
10e: 9f 93 push r25
__asm__ __volatile__("PUSH R26 \n\t");
110: af 93 push r26
__asm__ __volatile__("PUSH R27 \n\t");
112: bf 93 push r27
__asm__ __volatile__("PUSH R30 \n\t");
114: ef 93 push r30
__asm__ __volatile__("PUSH R31 \n\t");
116: ff 93 push r31
00000118 <Int_OSSched>:
__asm__ __volatile__("Int_OSSched: \n\t"); /*当中断要求调度,直接进入这里 */
__asm__ __volatile__("SEI \n\t");
118: 78 94 sei
/*
开中断,因为如果因中断在任务调度中进行,已经关中断
*/
__asm__ __volatile__("PUSH R28 \n\t"); /*R28与R29用于建立在堆栈上的指针 */
11a: cf 93 push r28
__asm__ __volatile__("PUSH R29 \n\t"); /*入栈完成 */
11c: df 93 push r29
TCB[OSPrioCur].OSTaskStackTop=SP; /*将正在运行的任务的堆栈底保存 */
11e: 83 2d mov r24, r3
120: 99 27 eor r25, r25
122: fc 01 movw r30, r24
124: ee 0f add r30, r30
126: ff 1f adc r31, r31
128: ee 0f add r30, r30
12a: ff 1f adc r31, r31
12c: e8 0f add r30, r24
12e: f9 1f adc r31, r25
130: e0 5a subi r30, 0xA0 ; 160
132: ff 4f sbci r31, 0xFF ; 255
134: 8d b7 in r24, 0x3d ; 61
136: 9e b7 in r25, 0x3e ; 62
138: 80 83 st Z, r24
13a: 91 83 std Z+1, r25 ; 0x01
OSPrioCur = OSPrioHighRdy ; /*运行当前就绪表中的最高优先级任务 */
13c: 35 2c mov r3, r5
cli(); /*保护堆栈转换,属于临界代码,要保护 */
13e: f8 94 cli
SP=TCB[OSPrioCur].OSTaskStackTop;
140: 85 2d mov r24, r5
142: 99 27 eor r25, r25
144: fc 01 movw r30, r24
146: ee 0f add r30, r30
148: ff 1f adc r31, r31
14a: ee 0f add r30, r30
14c: ff 1f adc r31, r31
14e: e8 0f add r30, r24
150: f9 1f adc r31, r25
152: e0 5a subi r30, 0xA0 ; 160
154: ff 4f sbci r31, 0xFF ; 255
156: 80 81 ld r24, Z
158: 91 81 ldd r25, Z+1 ; 0x01
15a: 9e bf out 0x3e, r25 ; 62
15c: 8d bf out 0x3d, r24 ; 61
sei();
15e: 78 94 sei
/*根据中断时的出栈次序*/
__asm__ __volatile__("POP R29 \n\t");
160: df 91 pop r29
__asm__ __volatile__("POP R28 \n\t");
162: cf 91 pop r28
__asm__ __volatile__("POP R31 \n\t");
164: ff 91 pop r31
__asm__ __volatile__("POP R30 \n\t");
166: ef 91 pop r30
__asm__ __volatile__("POP R27 \n\t");
168: bf 91 pop r27
__asm__ __volatile__("POP R26 \n\t");
16a: af 91 pop r26
__asm__ __volatile__("POP R25 \n\t");
16c: 9f 91 pop r25
__asm__ __volatile__("POP R24 \n\t");
16e: 8f 91 pop r24
__asm__ __volatile__("POP R23 \n\t");
170: 7f 91 pop r23
__asm__ __volatile__("POP R22 \n\t");
172: 6f 91 pop r22
__asm__ __volatile__("POP R21 \n\t");
174: 5f 91 pop r21
__asm__ __volatile__("POP R20 \n\t");
176: 4f 91 pop r20
__asm__ __volatile__("POP R19 \n\t");
178: 3f 91 pop r19
__asm__ __volatile__("POP R18 \n\t");
17a: 2f 91 pop r18
__asm__ __volatile__("POP __tmp_reg__ \n\t"); /*SERG 出栈并恢复 */
17c: 0f 90 pop r0
__asm__ __volatile__("OUT __SREG__,__tmp_reg__ \n\t");
17e: 0f be out 0x3f, r0 ; 63
__asm__ __volatile__("POP __tmp_reg__ \n\t"); /*R0 出栈 */
180: 0f 90 pop r0
__asm__ __volatile__("POP __zero_reg__ \n\t"); /*R1 出栈 */
182: 1f 90 pop r1
/*中断时出栈完成*/
__asm__ __volatile__("CLI \n\t"); /*关中断 */
184: f8 94 cli
__asm__ __volatile__("SBRC R16,1 \n\t");
186: 01 fd sbrc r16, 1
/*
SBRC当寄存器位为0则跳过下一条指令
检查系统正在进行任务调度时,是否有中断发生并进行要求任务调度,
如果中断要求调度则重新进行一次任务调度。
0x02是中断要求调度的标志位
*/
__asm__ __volatile__("RJMP OSSched \n\t"); /*重新调度 */
188: 22 c0 rjmp .+68 ; 0x1ce
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -