slyshyk 0 5 июня, 2009 Опубликовано 5 июня, 2009 (изменено) · Жалоба Собрал avr-gcc под Ubuntu. binutils-2.29.51 gcc-4.3.2 avr-libc-1.6.6 применил патчи от WinAvr-20090313. Собрал проект на линуксе и есть одно небольшое отличие, вопрос не смертельное ли оно :unsure: дисассемблер поекта на линуксе: ..... 00000098 <__do_copy_data>: 98: 13 e0 ldi r17, 0x03; 3 9a: a0 e0 ldi r26, 0x00; 0 9c: b1 e0 ldi r27, 0x01; 1 9e: e0 e8 ldi r30, 0x80; 128 a0: f1 e3 ldi r31, 0x31; 49 a2: 00 e0 ldi r16, 0x00; 0 a4: 0b bf out 0x3b, r16; 59 a6: 02 c0 rjmp .+4 ; 0xac <__do_copy_data+0x14> a8: 07 90 elpm r0, Z+ aa: 0d 92 st X+, r0 ac: a6 32 cpi r26, 0x26; 38 ae: b1 07 cpc r27, r17 b0: d9 f7 brne .-10 ; 0xa8 <__do_copy_data+0x10> 000000b2 <__do_clear_bss>: ..... и на винде: .... 00000098 <__do_copy_data>: 98: 13 e0 ldi r17, 0x03; 3 9a: a0 e0 ldi r26, 0x00; 0 9c: b1 e0 ldi r27, 0x01; 1 9e: ee e1 ldi r30, 0x1E; 30 a0: f2 e3 ldi r31, 0x32; 50 a2: 00 e0 ldi r16, 0x00; 0 a4: 0b bf out 0x3b, r16; 59 a6: 02 c0 rjmp .+4 ; 0xac <__do_copy_data+0x14> a8: 07 90 elpm r0, Z+ aa: 0d 92 st X+, r0 ac: a8 34 cpi r26, 0x48; 72 ae: b1 07 cpc r27, r17 b0: d9 f7 brne .-10 ; 0xa8 <__do_copy_data+0x10> b2: 1b be out 0x3b, r1; 59 000000b4 <__do_clear_bss>: .... разница в одну команду out 0x3b, r1 ; 59 проект компилировался для ATmega128 Изменено 5 июня, 2009 пользователем alex1979 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aesok 0 5 июня, 2009 Опубликовано 5 июня, 2009 (изменено) · Жалоба Собрал avr-gcc под Ubuntu. Собрал проект на линуксе и есть одно небольшое отличие, вопрос не смертельное ли оно :unsure: ... разница в одну команду out 0x3b, r1 ; 59 проект компилировался для ATmega128 Для ATmega не смертельно, для ATxmega смертельно. Анатолий. Изменено 5 июня, 2009 пользователем aesok Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slyshyk 0 5 июня, 2009 Опубликовано 5 июня, 2009 · Жалоба Для ATmega не смертельно, для ATxmega смертельно. Анатолий. в обозримом будущем буду применять ATmega. :rolleyes: спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
legotron 0 1 июля, 2009 Опубликовано 1 июля, 2009 · Жалоба Собрал проект на линуксе и есть одно небольшое отличие, вопрос не смертельное ли оно :unsure: 2All: Уважаемые, не могли бы вы объяснить, в чем суть различий?? Почему на ATxmega работать не будет?? Очень интересно понять смысл вопроса, не выкидывать же многотысячные строки дизасемблера в форум для принятия решения, будет работать на ATxmega или нет.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xelax 0 1 июля, 2009 Опубликовано 1 июля, 2009 · Жалоба Одна и таже версия компилятора, должна давать одинаковый код для одного и того же target на любых host платформах. Что-то вы недособирали для gcc под Ubuntu. Или наоборот не те патчи наложили. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slyshyk 0 1 июля, 2009 Опубликовано 1 июля, 2009 · Жалоба Одна и таже версия компилятора, должна давать одинаковый код для одного и того же target на любых host платформах. Что-то вы недособирали для gcc под Ubuntu. Или наоборот не те патчи наложили. Версия binutils другая, не все патчи установились :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kurtis 0 1 июля, 2009 Опубликовано 1 июля, 2009 · Жалоба Binutils не влияет на генерацию кода, ассемблерный код генерирует компилятор. А проекты скомпилированные под Убунтой в реальном железе стабильно работают? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slyshyk 0 1 июля, 2009 Опубликовано 1 июля, 2009 · Жалоба Binutils не влияет на генерацию кода, ассемблерный код генерирует компилятор. А проекты скомпилированные под Убунтой в реальном железе стабильно работают? К сожалению пока нет проектов скомпилированных под убунтой в реальном железе :crying: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aesok 0 1 июля, 2009 Опубликовано 1 июля, 2009 · Жалоба 2All: Уважаемые, не могли бы вы объяснить, в чем суть различий?? Почему на ATxmega работать не будет?? out 0x3b, r1 - переводиться как 'out RAMPZ, __zero_reg__' или друними словами обнулить регистр RAMPZ. ATmegа контролеры имеют до 64КВ RAM, регистр RAMPZ используется как старший байт регистра Z только для адресации более 64 КВ FLASH и в програме всегда уснанавливается перед исполнением инструкций ELPM и SPM. Его состояния не оказывает никакого влияния на код генерируемый avr-gcc. ATxmega контролеры могут адресовать до 16 MB RAM и регистр RAMPZ ипользуеться как старший байт регистра Z как для доступа к FLASH инструкциями ELPM и SPM так и для доступа к RAM инструкциями LD и ST. avr-gcc не знает о существовании регистра RAMPZ а также о RAMPX, RAMPY и RAMPD и никогда не устанавливает их перед инструкциями LD и ST. Для коректной работы кода генерируемого avr-gcc неодходимо чтобы эти регистры содержали нули, поэтому RAMPZ и должен быть обнулен в стартап коде после использования. Анатолий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slyshyk 0 2 июля, 2009 Опубликовано 2 июля, 2009 · Жалоба Хочу заметить , что регистр RAMPZ всетаки обнуляется инструкциями ....... a2: 00 e0 ldi r16, 0x00; 0 a4: 0b bf out 0x3b, r16; 59 ...... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aesok 0 2 июля, 2009 Опубликовано 2 июля, 2009 (изменено) · Жалоба Хочу заметить , что регистр RAMPZ всетаки обнуляется инструкциями ....... a2: 00 e0 ldi r16, 0x00; 0 a4: 0b bf out 0x3b, r16; 59 ...... Это не обнуление RAMPZ! Это инициализаци RAMPZ старшим байтом адреса метки __data_load_start: __do_copy_data: ldi r17, hi8(__data_end) ldi r26, lo8(__data_start) ldi r27, hi8(__data_start) ldi r30, lo8(__data_load_start) ldi r31, hi8(__data_load_start) /* On the enhanced core, "elpm" with post-increment updates RAMPZ automatically. Otherwise we have to handle it ourselves. */ #ifdef __AVR_ENHANCED__ ldi r16, hh8(__data_load_start) #else ldi r16, hh8(__data_load_start - 0x10000) .L__do_copy_data_carry: inc r16 #endif out AVR_RAMPZ_ADDR, r16 Анатолий. Изменено 2 июля, 2009 пользователем aesok Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slyshyk 0 2 июля, 2009 Опубликовано 2 июля, 2009 · Жалоба вопрос скорее к Анатолию. нашел конструкцию, которая отвечает за обнуление RAMPZ (в файле avr-libc-1.6.6/crt1/gcrt1.S) #ifdef __AVR_HAVE_RAMPD__ out AVR_RAMPZ_ADDR, __zero_reg__ #endif /* __AVR_HAVE_RAMPD__*/ остается вопрос - это правильно или как. P.S. прикладываю весь файл gcrt1.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aesok 0 2 июля, 2009 Опубликовано 2 июля, 2009 (изменено) · Жалоба остается вопрос - это правильно или как. Да эта инструкция необходима, я дал развернутый ответ в посте #9 Анатолий. Изменено 2 июля, 2009 пользователем aesok Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slyshyk 0 2 июля, 2009 Опубликовано 2 июля, 2009 · Жалоба Да эта инструкция необходима, я дал развернутый ответ в посте #9 Анатолий. задавая вопрос это правильно или как, я имел в виду директивы условной компиляции, которыми окружена команда обнуления регистра Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aesok 0 2 июля, 2009 Опубликовано 2 июля, 2009 · Жалоба задавая вопрос это правильно или как, я имел в виду директивы условной компиляции, которыми окружена команда обнуления регистра Да правально, хотя лучшей читаемости кода было бы логично добавть в GCC макрос __AVR_HAVE_MORE_64K_RAM__ и использовать его здесь. Анатолий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться