klen 1 4 декабря, 2006 Опубликовано 4 декабря, 2006 · Жалоба Собрал новые сборки GCC для ARM/AVR, кому интересно качайте пробуйте, сообщайте о глюках. Сборка для AVR протестина мной на текущем проекте, все пока работает. http://www.klen.org/Projects/Embeded-gnu-t...last_build.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 5 декабря, 2006 Опубликовано 5 декабря, 2006 · Жалоба Собрал новые сборки 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 и можно ли это как-нибудь обойти ? (соптимизировать) Ну, или может быть Вы знаете кому можно переадресовать этот вопрос ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NullPointer 0 5 декабря, 2006 Опубликовано 5 декабря, 2006 · Жалоба Есть 20060421 WinAVR (работает, компилирует, ошибок нет). Скажите, как на него поставить вашу сборку? Если скопировать поверх, то ругается: не может открыть ни одного стандартного хедера... Чайник я, что не так делаю? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 5 декабря, 2006 Опубликовано 5 декабря, 2006 · Жалоба 2_singlskv Кусочек С кода приведите который приводитк к такой генерации, я посмотрю че происходит, очень интересно. 2_SysRq :) я сам решаю эту проблему так указанием путя с помощю опции -I для gcc или прописыванием PATH=$(PATH);aaa/bbb/cccc/rootdir/local/avr/include тогда начинает работать. А вы относительный путь сохранили от local/bin/avr-gcc до local/avr/include? Я как раз и работаю над тем чтоб небыло таких проблем при установке пакета в любое место. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 5 декабря, 2006 Опубликовано 5 декабря, 2006 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 5 декабря, 2006 Опубликовано 5 декабря, 2006 · Жалоба Тупо всунул и закомпилял: 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 есть константа типа адресс, взять от нее еще раз адрес это че получится?. Или я чето не догнал? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 5 декабря, 2006 Опубликовано 5 декабря, 2006 · Жалоба Тупо всунул и закомпилял: 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, и взять что там хранится типа индерект доступ к портам. А код у Вас странный скомпилился. Какой уровень оптимизации у Вас стоит ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 5 декабря, 2006 Опубликовано 5 декабря, 2006 · Жалоба А код у Вас странный скомпилился. Какой уровень оптимизации у Вас стоит ? я почти всегда использую -Os, он и быстр и меньше размер. Без оптимизации только для особых случаев - например сравнить чтот с чемто. Потому что с отладочной инфой в формате dwarf2 отладчик AVRS и так не плохо лазит по коду. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 5 декабря, 2006 Опубликовано 5 декабря, 2006 · Жалоба Тупо всунул и закомпилял: 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]); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 5 декабря, 2006 Опубликовано 5 декабря, 2006 · Жалоба код: //------------------------------------------------------------------- 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 уже не пресутствует :) А это ваще правильный код, мне в данный момент некогда разглядывать его. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 6 декабря, 2006 Опубликовано 6 декабря, 2006 · Жалоба код: //------------------------------------------------------------------- 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 6 декабря, 2006 Опубликовано 6 декабря, 2006 · Жалоба Опции компиляции: avr-gcc -c -mmcu=atmega88 -I. -gdwarf-2 -DF_CPU=24000000 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.lst -I/local/avr/include -std=gnu99 -Wp,-M,-MP,-MT,main.o,-MF,.dep/main.o.d main.c -o main.o Код модуля main.c из одной функции которую я уже привел Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 6 декабря, 2006 Опубликовано 6 декабря, 2006 · Жалоба Вот код который я ему подсунул: (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 никуда не пропал (блин гад такой :angry2: ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 6 декабря, 2006 Опубликовано 6 декабря, 2006 · Жалоба оптимизация -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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 6 декабря, 2006 Опубликовано 6 декабря, 2006 · Жалоба оптимизация -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 отсутствует :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться