|
Собрал свежий GCC, bu2.17 avr-gcc4.2.0-20061121 avr-libc-1.4.5 |
|
|
|
Dec 5 2006, 02:34
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(klen @ Dec 4 2006, 18:16)  Собрал новые сборки GCC для ARM/AVR, кому интересно качайте пробуйте, сообщайте о глюках. Сборка для AVR протестина мной на текущем проекте, все пока работает. http://www.klen.org/Projects/Embeded-gnu-t...last_build.htmlУ меня есть вопросик к Вам, как к человеку имеющему некоторое отношение к GCC. Можете ли Вы сказать почему GCC генерит такой код: Код +0000020A: 91800109 LDS R24,0x0109 Load direct from data space +0000020C: 2FE8 MOV R30,R24 Copy register +0000020D: 27FF CLR R31 Clear Register +0000020E: 8180 LDD R24,Z+0 Load indirect with displacement вместо Код LDS R30,0x0109 CLR R31 LDD R24,Z+0 и можно ли это как-нибудь обойти ? (соптимизировать) Ну, или может быть Вы знаете кому можно переадресовать этот вопрос ?
|
|
|
|
|
Dec 5 2006, 11:28
|

бессмертным стать можно тремя способами
    
Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912

|
2_singlskv Кусочек С кода приведите который приводитк к такой генерации, я посмотрю че происходит, очень интересно. 2_SysRq  я сам решаю эту проблему так указанием путя с помощю опции -I для gcc или прописыванием PATH=$(PATH);aaa/bbb/cccc/rootdir/local/avr/include тогда начинает работать. А вы относительный путь сохранили от local/bin/avr-gcc до local/avr/include? Я как раз и работаю над тем чтоб небыло таких проблем при установке пакета в любое место.
|
|
|
|
|
Dec 5 2006, 11:49
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(klen @ Dec 5 2006, 11:28)  2_singlskv Кусочек С кода приведите который приводитк к такой генерации, я посмотрю че происходит, очень интересно. Код BYTE PIN_[2]={ (BYTE)(&PINB), (BYTE)(&PIND) };
tmp1= *(volatile BYTE *)((WORD)PIN_[0]); результат компиляции Код 160: tmp1= *(volatile BYTE *)((WORD)PIN_[0]); +0000020A: 91800100 LDS R24,0x0100 Load direct from data space +0000020C: 2FE8 MOV R30,R24 Copy register +0000020D: 27FF CLR R31 Clear Register +0000020E: 8180 LDD R24,Z+0 Load indirect with displacement
|
|
|
|
|
Dec 5 2006, 12:14
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(klen @ Dec 5 2006, 12:01)  Тупо всунул и закомпилял: Код uint8_t PIN_[2]={ (uint8_t)(&PINB), (uint8_t)(&PIND) };
volatile uint8_t tmp1= *(volatile uint8_t *)((uint16_t)PIN_[0]); 26: 83 b1 in r24, 0x03; 3 28: 89 83 std Y+1, r24; 0x01 Но сам код странный, напимер &PINB - ведь PINB есть константа типа адресс, взять от нее еще раз адрес это че получится?. Или я чето не догнал? Нет, это преобразуем &PINB к указателю на uint8_t, и взять что там хранится типа индерект доступ к портам. А код у Вас странный скомпилился. Какой уровень оптимизации у Вас стоит ?
|
|
|
|
|
Dec 5 2006, 15:17
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(klen @ Dec 5 2006, 12:01)  Тупо всунул и закомпилял: Код uint8_t PIN_[2]={ (uint8_t)(&PINB), (uint8_t)(&PIND) };
volatile uint8_t tmp1= *(volatile uint8_t *)((uint16_t)PIN_[0]); 26: 83 b1 in r24, 0x03; 3 28: 89 83 std Y+1, r24; 0x01 А как он у Вас закомпелит вот такой код ? Код uint8_t PIN_[2]={ (uint8_t)(&PINB), (uint8_t)(&PIND) };
uint8_t tmp1= *(volatile uint8_t *)((uint16_t)PIN_[0]); PIN_[0]=(uint8_t)(&PIND); uint8_t tmp2= *(volatile uint8_t *)((uint16_t)PIN_[0]); PIN_[0]=(uint8_t)(&PING); uint8_t tmp3= *(volatile uint8_t *)((uint16_t)PIN_[0]);
|
|
|
|
|
Dec 5 2006, 23:45
|

бессмертным стать можно тремя способами
    
Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912

|
код: Код //------------------------------------------------------------------- void x () __attribute__ ((naked)); void x () { volatile uint8_t PIN_[2]={ (uint8_t)(&PINB), (uint8_t)(&PIND) };
volatile uint8_t tmp1= *(volatile uint8_t *)((uint16_t)PIN_[0]); PIN_[0]=(uint8_t)(&PIND); volatile uint8_t tmp2= *(volatile uint8_t *)((uint16_t)PIN_[0]); PIN_[0]=(uint8_t)(&PINC); volatile uint8_t tmp3= *(volatile uint8_t *)((uint16_t)PIN_[0]); } листинг .lss Код //------------------------------------------------------------------- void x () __attribute__ ((naked)); void x () { 1c2: 83 e2 ldi r24, 0x23; 35 1c4: 8c 83 std Y+4, r24; 0x04 1c6: 99 e2 ldi r25, 0x29; 41 1c8: 9d 83 std Y+5, r25; 0x05 volatile uint8_t PIN_[2]={ (uint8_t)(&PINB), (uint8_t)(&PIND) };
volatile uint8_t tmp1= *(volatile uint8_t *)((uint16_t)PIN_[0]); 1ca: ec 81 ldd r30, Y+4; 0x04 1cc: ff 27 eor r31, r31 1ce: 80 81 ld r24, Z 1d0: 89 83 std Y+1, r24; 0x01 PIN_[0]=(uint8_t)(&PIND); 1d2: 9c 83 std Y+4, r25; 0x04 volatile uint8_t tmp2= *(volatile uint8_t *)((uint16_t)PIN_[0]); 1d4: ec 81 ldd r30, Y+4; 0x04 1d6: ff 27 eor r31, r31 1d8: 80 81 ld r24, Z 1da: 8a 83 std Y+2, r24; 0x02 PIN_[0]=(uint8_t)(&PINC); 1dc: 86 e2 ldi r24, 0x26; 38 1de: 8c 83 std Y+4, r24; 0x04 volatile uint8_t tmp3= *(volatile uint8_t *)((uint16_t)PIN_[0]); 1e0: ec 81 ldd r30, Y+4; 0x04 1e2: ff 27 eor r31, r31 1e4: 80 81 ld r24, Z 1e6: 8b 83 std Y+3, r24; 0x03 Какие выводы? К примеру mov уже не пресутствует  А это ваще правильный код, мне в данный момент некогда разглядывать его.
|
|
|
|
|
Dec 6 2006, 00:16
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(klen @ Dec 5 2006, 23:45)  код: Код //------------------------------------------------------------------- void x () __attribute__ ((naked)); void x () { volatile uint8_t PIN_[2]={ (uint8_t)(&PINB), (uint8_t)(&PIND) };
volatile uint8_t tmp1= *(volatile uint8_t *)((uint16_t)PIN_[0]); PIN_[0]=(uint8_t)(&PIND); volatile uint8_t tmp2= *(volatile uint8_t *)((uint16_t)PIN_[0]); PIN_[0]=(uint8_t)(&PINC); volatile uint8_t tmp3= *(volatile uint8_t *)((uint16_t)PIN_[0]); } листинг .lss Код //------------------------------------------------------------------- void x () __attribute__ ((naked)); void x () { 1c2: 83 e2 ldi r24, 0x23; 35 1c4: 8c 83 std Y+4, r24; 0x04 1c6: 99 e2 ldi r25, 0x29; 41 1c8: 9d 83 std Y+5, r25; 0x05 volatile uint8_t PIN_[2]={ (uint8_t)(&PINB), (uint8_t)(&PIND) };
volatile uint8_t tmp1= *(volatile uint8_t *)((uint16_t)PIN_[0]); 1ca: ec 81 ldd r30, Y+4; 0x04 1cc: ff 27 eor r31, r31 1ce: 80 81 ld r24, Z 1d0: 89 83 std Y+1, r24; 0x01 PIN_[0]=(uint8_t)(&PIND); 1d2: 9c 83 std Y+4, r25; 0x04 volatile uint8_t tmp2= *(volatile uint8_t *)((uint16_t)PIN_[0]); 1d4: ec 81 ldd r30, Y+4; 0x04 1d6: ff 27 eor r31, r31 1d8: 80 81 ld r24, Z 1da: 8a 83 std Y+2, r24; 0x02 PIN_[0]=(uint8_t)(&PINC); 1dc: 86 e2 ldi r24, 0x26; 38 1de: 8c 83 std Y+4, r24; 0x04 volatile uint8_t tmp3= *(volatile uint8_t *)((uint16_t)PIN_[0]); 1e0: ec 81 ldd r30, Y+4; 0x04 1e2: ff 27 eor r31, r31 1e4: 80 81 ld r24, Z 1e6: 8b 83 std Y+3, r24; 0x03 Какие выводы? К примеру mov уже не пресутствует  А это ваще правильный код, мне в данный момент некогда разглядывать его. А можно код полностью, и с опциями компилятору/ линкеру, тогда сравним/ проверим. и еще,тип процессора укажите, please
|
|
|
|
|
Dec 6 2006, 00:39
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Вот код который я ему подсунул: (WinAVR 20060421 оптимизация -Os) Код #include <avr/io.h>
uint8_t PIN_[2]={ (uint8_t)(&PINB), (uint8_t)(&PIND) }; int main() { volatile uint8_t tmp1= *(volatile uint8_t *)((uint16_t)PIN_[0]); return tmp1; } результат: Код +00000035: EFCE LDI R28,0xFE Load immediate +00000036: E0D4 LDI R29,0x04 Load immediate +00000037: BFDE OUT 0x3E,R29 Out to I/O location +00000038: BFCD OUT 0x3D,R28 Out to I/O location 9: volatile uint8_t tmp1= *(volatile uint8_t *)((uint16_t)PIN_[0]); +00000039: 91800100 LDS R24,0x0100 Load direct from data space +0000003B: 2FE8 MOV R30,R24 Copy register +0000003C: 27FF CLR R31 Clear Register +0000003D: 8180 LDD R24,Z+0 Load indirect with displacement +0000003E: 8389 STD Y+1,R24 Store indirect with displacement 10: return tmp1; +0000003F: 8189 LDD R24,Y+1 Load indirect with displacement 11: } Э...Э... mov r30,r24 никуда не пропал (блин гад такой  )
|
|
|
|
|
Dec 6 2006, 01:15
|

бессмертным стать можно тремя способами
    
Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912

|
оптимизация -Os gcc4.2.0 Код #include <avr/io.h>
uint8_t PIN_[2]={ (uint8_t)(&PINB), (uint8_t)(&PIND) }; int main_1() { volatile uint8_t tmp1= *(volatile uint8_t *)((uint16_t)PIN_[0]); return tmp1; } результат: Код test.o: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn 0 .text 00000034 00000000 00000000 00000034 2**0 CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE 1 .data 00000002 00000000 00000000 00000068 2**0 CONTENTS, ALLOC, LOAD, DATA 2 .bss 00000000 00000000 00000000 0000006a 2**0 ALLOC 3 .debug_abbrev 00000090 00000000 00000000 0000006a 2**0 CONTENTS, READONLY, DEBUGGING 4 .debug_info 000000b3 00000000 00000000 000000fa 2**0 CONTENTS, RELOC, READONLY, DEBUGGING 5 .debug_line 00000088 00000000 00000000 000001ad 2**0 CONTENTS, RELOC, READONLY, DEBUGGING 6 .debug_frame 0000001c 00000000 00000000 00000235 2**0 CONTENTS, RELOC, READONLY, DEBUGGING 7 .debug_pubnames 00000026 00000000 00000000 00000251 2**0 CONTENTS, RELOC, READONLY, DEBUGGING 8 .debug_aranges 00000014 00000000 00000000 00000277 2**0 CONTENTS, RELOC, READONLY, DEBUGGING 9 .debug_str 0000012d 00000000 00000000 0000028b 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text:
00000000 <main_1>: (uint8_t)(&PINB), (uint8_t)(&PIND) }; int main_1() { 0: cf 93 push r28 2: df 93 push r29 4: cd b7 in r28, 0x3d; 61 6: de b7 in r29, 0x3e; 62 8: 21 97 sbiw r28, 0x01; 1 a: 0f b6 in r0, 0x3f; 63 c: f8 94 cli e: de bf out 0x3e, r29; 62 10: 0f be out 0x3f, r0; 63 12: cd bf out 0x3d, r28; 61 volatile uint8_t tmp1= *(volatile uint8_t *)((uint16_t)PIN_[0]); 14: e0 91 00 00 lds r30, 0x0000 18: ff 27 eor r31, r31 1a: 80 81 ld r24, Z 1c: 89 83 std Y+1, r24; 0x01 return tmp1; 1e: 89 81 ldd r24, Y+1; 0x01 } 20: 99 27 eor r25, r25 22: 21 96 adiw r28, 0x01; 1 24: 0f b6 in r0, 0x3f; 63 26: f8 94 cli 28: de bf out 0x3e, r29; 62 2a: 0f be out 0x3f, r0; 63 2c: cd bf out 0x3d, r28; 61 2e: df 91 pop r29 30: cf 91 pop r28 32: 08 95 ret
|
|
|
|
|
Dec 6 2006, 13:40
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(klen @ Dec 6 2006, 01:15)  оптимизация -Os gcc4.2.0 Код volatile uint8_t tmp1= *(volatile uint8_t *)((uint16_t)PIN_[0]); 14: e0 91 00 00 lds r30, 0x0000 18: ff 27 eor r31, r31 1a: 80 81 ld r24, Z 1c: 89 83 std Y+1, r24; 0x01 Судя по всему Ваша версия не осилила конструкцию. lds r30,0x0000 эквивалентно mov r30,r1 Возможно в Вашей версии нужно писать просто PINB вместо &PINB но зато mov r30,r24 отсутствует
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|