|
avr-gcc Ubuntu 8.10, будет ли работать? |
|
|
|
Jun 5 2009, 06:14
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 23-11-07
Из: Украина, Волынь
Пользователь №: 32 613

|
Собрал avr-gcc под Ubuntu. binutils-2.29.51 gcc-4.3.2 avr-libc-1.6.6 применил патчи от WinAvr-20090313. Собрал проект на линуксе и есть одно небольшое отличие, вопрос не смертельное ли оно дисассемблер поекта на линуксе: Код ..... 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
Сообщение отредактировал alex1979 - Jun 5 2009, 06:28
|
|
|
|
|
 |
Ответов
(1 - 14)
|
Jun 5 2009, 06:36
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(alex1979 @ Jun 5 2009, 10:14)  Собрал avr-gcc под Ubuntu. Собрал проект на линуксе и есть одно небольшое отличие, вопрос не смертельное ли оно ... разница в одну команду out 0x3b, r1 ; 59 проект компилировался для ATmega128 Для ATmega не смертельно, для ATxmega смертельно. Анатолий.
Сообщение отредактировал aesok - Jun 5 2009, 06:36
|
|
|
|
|
Jun 5 2009, 06:46
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 23-11-07
Из: Украина, Волынь
Пользователь №: 32 613

|
Цитата(aesok @ Jun 5 2009, 09:36)  Для ATmega не смертельно, для ATxmega смертельно.
Анатолий. в обозримом будущем буду применять ATmega.  спасибо
|
|
|
|
|
Jul 1 2009, 07:35
|

инопланетянин
  
Группа: Свой
Сообщений: 236
Регистрация: 24-12-06
Из: Питер
Пользователь №: 23 832

|
Цитата(alex1979 @ Jun 5 2009, 10:14)  Собрал проект на линуксе и есть одно небольшое отличие, вопрос не смертельное ли оно  2All: Уважаемые, не могли бы вы объяснить, в чем суть различий?? Почему на ATxmega работать не будет?? Очень интересно понять смысл вопроса, не выкидывать же многотысячные строки дизасемблера в форум для принятия решения, будет работать на ATxmega или нет..
|
|
|
|
|
Jul 1 2009, 11:14
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 23-11-07
Из: Украина, Волынь
Пользователь №: 32 613

|
Цитата(xelax @ Jul 1 2009, 11:34)  Одна и таже версия компилятора, должна давать одинаковый код для одного и того же target на любых host платформах.
Что-то вы недособирали для gcc под Ubuntu. Или наоборот не те патчи наложили. Версия binutils другая, не все патчи установились
|
|
|
|
|
Jul 1 2009, 13:04
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 23-11-07
Из: Украина, Волынь
Пользователь №: 32 613

|
Цитата(kurtis @ Jul 1 2009, 14:53)  Binutils не влияет на генерацию кода, ассемблерный код генерирует компилятор.
А проекты скомпилированные под Убунтой в реальном железе стабильно работают? К сожалению пока нет проектов скомпилированных под убунтой в реальном железе
|
|
|
|
|
Jul 1 2009, 19:31
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(Legotron @ Jul 1 2009, 11:35)  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 и должен быть обнулен в стартап коде после использования. Анатолий.
|
|
|
|
|
Jul 2 2009, 05:10
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 23-11-07
Из: Украина, Волынь
Пользователь №: 32 613

|
Хочу заметить , что регистр RAMPZ всетаки обнуляется инструкциями Код ....... a2: 00 e0 ldi r16, 0x00; 0 a4: 0b bf out 0x3b, r16; 59 ......
|
|
|
|
|
Jul 2 2009, 05:47
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(alex1979 @ Jul 2 2009, 09:10)  Хочу заметить , что регистр 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 Анатолий.
Сообщение отредактировал aesok - Jul 2 2009, 05:58
|
|
|
|
|
Jul 2 2009, 11:31
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 23-11-07
Из: Украина, Волынь
Пользователь №: 32 613

|
вопрос скорее к Анатолию. нашел конструкцию, которая отвечает за обнуление 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 ( 2.42 килобайт )
Кол-во скачиваний: 22
|
|
|
|
|
Jul 2 2009, 16:35
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(alex1979 @ Jul 2 2009, 15:31)  остается вопрос - это правильно или как. Да эта инструкция необходима, я дал развернутый ответ в посте #9 Анатолий.
Сообщение отредактировал aesok - Jul 2 2009, 16:35
|
|
|
|
|
Jul 2 2009, 20:32
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 23-11-07
Из: Украина, Волынь
Пользователь №: 32 613

|
Цитата(aesok @ Jul 2 2009, 19:35)  Да эта инструкция необходима, я дал развернутый ответ в посте #9
Анатолий. задавая вопрос это правильно или как, я имел в виду директивы условной компиляции, которыми окружена команда обнуления регистра
|
|
|
|
|
Jul 2 2009, 21:56
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(alex1979 @ Jul 3 2009, 00:32)  задавая вопрос это правильно или как, я имел в виду директивы условной компиляции, которыми окружена команда обнуления регистра Да правально, хотя лучшей читаемости кода было бы логично добавть в GCC макрос __AVR_HAVE_MORE_64K_RAM__ и использовать его здесь. Анатолий.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|