Alex,
You wrote to Andrey Arnold:
AA>> Я не знаю, как там у ИАРа, а вот у WinAVR пока до выполнения AA>> первой команды явно написанного С-кода дойдёт (инициализация того AA>> же прерывания, к примеру) столько воды может утечь, что AA>> об описанных эффектах можно забыть. AM>
AA>> (В одном из реальных проектов, верхний софт для которого писал не AA>> я, от Ресета до первой С-команды - 6,5мс... AM> Только WinAVR тут ни при чем. Что в стартапе написали, то AM> процессор после сброса и выполняет. Пролог же функции main, AM> генерируемый самим gcc, ничего "лишнего" не содержит, может быть даже AM> вообще пустым.
А вот это я не понял... как это пустым...
Вот я написал программку:
=== Begin of for.c === #include <avr/io.h>
#include <iom128.h>
int main(void) { char i; char j; PORTC = PORTC & ~0x01 | 0x80; for (i=0;i<8;i++) { // j = j +i; }
for (i=7;i<0;i--) { // j = j +i; } } === End of for.c =====
=== Begin of for.lss ===
for.elf: file format elf32-avr
Sections: Idx Name Size VMA LMA File off Algn 0 .data 00000000 00800100 0000010a 0000019e 2**0 CONTENTS, ALLOC, LOAD, DATA 1 .text 0000010a 00000000 00000000 00000094 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE 2 .bss 00000000 00800100 0000010a 0000019e 2**0 ALLOC 3 .noinit 00000000 00800100 00800100 0000019e 2**0 CONTENTS 4 .eeprom 00000000 00810000 00810000 0000019e 2**0 CONTENTS 5 .debug_aranges 00000014 00000000 00000000 0000019e 2**0 CONTENTS, READONLY, DEBUGGING 6 .debug_pubnames 0000001b 00000000 00000000 000001b2 2**0 CONTENTS, READONLY, DEBUGGING 7 .debug_info 00000107 00000000 00000000 000001cd 2**0 CONTENTS, READONLY, DEBUGGING 8 .debug_abbrev 00000047 00000000 00000000 000002d4 2**0 CONTENTS, READONLY, DEBUGGING 9 .debug_line 000000af 00000000 00000000 0000031b 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text:
00000000 <__vectors>: 0: 0c 94 46 00 jmp 0x8c 4: 0c 94 63 00 jmp 0xc6 8: 0c 94 63 00 jmp 0xc6 c: 0c 94 63 00 jmp 0xc6 10: 0c 94 63 00 jmp 0xc6 14: 0c 94 63 00 jmp 0xc6 18: 0c 94 63 00 jmp 0xc6 1c: 0c 94 63 00 jmp 0xc6 20: 0c 94 63 00 jmp 0xc6 24: 0c 94 63 00 jmp 0xc6 28: 0c 94 63 00 jmp 0xc6 2c: 0c 94 63 00 jmp 0xc6 30: 0c 94 63 00 jmp 0xc6 34: 0c 94 63 00 jmp 0xc6 38: 0c 94 63 00 jmp 0xc6 3c: 0c 94 63 00 jmp 0xc6 40: 0c 94 63 00 jmp 0xc6 44: 0c 94 63 00 jmp 0xc6 48: 0c 94 63 00 jmp 0xc6 4c: 0c 94 63 00 jmp 0xc6 50: 0c 94 63 00 jmp 0xc6 54: 0c 94 63 00 jmp 0xc6 58: 0c 94 63 00 jmp 0xc6 5c: 0c 94 63 00 jmp 0xc6 60: 0c 94 63 00 jmp 0xc6 64: 0c 94 63 00 jmp 0xc6 68: 0c 94 63 00 jmp 0xc6 6c: 0c 94 63 00 jmp 0xc6 70: 0c 94 63 00 jmp 0xc6 74: 0c 94 63 00 jmp 0xc6 78: 0c 94 63 00 jmp 0xc6 7c: 0c 94 63 00 jmp 0xc6 80: 0c 94 63 00 jmp 0xc6 84: 0c 94 63 00 jmp 0xc6 88: 0c 94 63 00 jmp 0xc6
0000008c <__ctors_end>: 8c: 11 24 eor r1, r1 8e: 1f be out 0x3f, r1 ; 63 90: cf ef ldi r28, 0xFF ; 255 92: d0 e1 ldi r29, 0x10 ; 16 94: de bf out 0x3e, r29 ; 62 96: cd bf out 0x3d, r28 ; 61
00000098 <__do_copy_data>: 98: 11 e0 ldi r17, 0x01 ; 1 9a: a0 e0 ldi r26, 0x00 ; 0 9c: b1 e0 ldi r27, 0x01 ; 1 9e: ea e0 ldi r30, 0x0A ; 10 a0: f1 e0 ldi r31, 0x01 ; 1 a2: 00 e0 ldi r16, 0x00 ; 0 a4: 0b bf out 0x3b, r16 ; 59 a6: 02 c0 rjmp .+4 ; 0xac
000000a8 <.__do_copy_data_loop>: a8: 07 90 elpm r0, Z+ aa: 0d 92 st X+, r0
000000ac <.__do_copy_data_start>: ac: a0 30 cpi r26, 0x00 ; 0 ae: b1 07 cpc r27, r17 b0: d9 f7 brne .-10 ; 0xa8
000000b2 <__do_clear_bss>: b2: 11 e0 ldi r17, 0x01 ; 1 b4: a0 e0 ldi r26, 0x00 ; 0 b6: b1 e0 ldi r27, 0x01 ; 1 b8: 01 c0 rjmp .+2 ; 0xbc
000000ba <.do_clear_bss_loop>: ba: 1d 92 st X+, r1
000000bc <.do_clear_bss_start>: bc: a0 30 cpi r26, 0x00 ; 0 be: b1 07 cpc r27, r17 c0: e1 f7 brne .-8 ; 0xba c2: 0c 94 65 00 jmp 0xca
000000c6 <__bad_interrupt>: c6: 0c 94 00 00 jmp 0x0
------------------------------ И как избавиться тут от
__do_copy_data
?
Другое дело, что в данном случае объём копирования нулевой ...
------------------------------
000000ca <main>: #include <avr/io.h>
#include <iom128.h>
int main(void) { ca: cd ef ldi r28, 0xFD ; 253 cc: d0 e1 ldi r29, 0x10 ; 16 ce: de bf out 0x3e, r29 ; 62 d0: cd bf out 0x3d, r28 ; 61 char i; char j; PORTC = PORTC & ~0x01 | 0x80; d2: 80 91 35 00 lds r24, 0x0035 d6: 98 2f mov r25, r24 d8: 9e 7f andi r25, 0xFE ; 254 da: 80 e8 ldi r24, 0x80 ; 128 dc: 89 2b or r24, r25 de: 80 93 35 00 sts 0x0035, r24 for (i=0;i<8;i++) e2: 19 82 std Y+1, r1 ; 0x01 e4: 89 81 ldd r24, Y+1 ; 0x01 e6: 88 30 cpi r24, 0x08 ; 8 e8: 24 f4 brge .+8 ; 0xf2 ea: 89 81 ldd r24, Y+1 ; 0x01 ec: 8f 5f subi r24, 0xFF ; 255 ee: 89 83 std Y+1, r24 ; 0x01 f0: f9 cf rjmp .-14 ; 0xe4 { // j = j +i; }
for (i=7;i<0;i--) f2: 87 e0 ldi r24, 0x07 ; 7 f4: 89 83 std Y+1, r24 ; 0x01 f6: 89 81 ldd r24, Y+1 ; 0x01 f8: 88 23 and r24, r24 fa: 24 f4 brge .+8 ; 0x104 fc: 89 81 ldd r24, Y+1 ; 0x01 fe: 81 50 subi r24, 0x01 ; 1 100: 89 83 std Y+1, r24 ; 0x01 102: f9 cf rjmp .-14 ; 0xf6 104: 0c 94 84 00 jmp 0x108
00000108 <_exit>: 108: ff cf rjmp .-2 ; 0x108
=== End of for.lss =====
Andrey