Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: avr-gcc Ubuntu 8.10
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
alex1979
Собрал avr-gcc под Ubuntu.
binutils-2.29.51
gcc-4.3.2
avr-libc-1.6.6
применил патчи от WinAvr-20090313.

Собрал проект на линуксе и есть одно небольшое отличие, вопрос не смертельное ли оно unsure.gif

дисассемблер поекта на линуксе:
Код
.....
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
aesok
Цитата(alex1979 @ Jun 5 2009, 10:14) *
Собрал avr-gcc под Ubuntu.
Собрал проект на линуксе и есть одно небольшое отличие, вопрос не смертельное ли оно unsure.gif
...
разница в одну команду out 0x3b, r1 ; 59

проект компилировался для ATmega128


Для ATmega не смертельно, для ATxmega смертельно.

Анатолий.
alex1979
Цитата(aesok @ Jun 5 2009, 09:36) *
Для ATmega не смертельно, для ATxmega смертельно.

Анатолий.


в обозримом будущем буду применять ATmega. rolleyes.gif спасибо
Legotron
Цитата(alex1979 @ Jun 5 2009, 10:14) *
Собрал проект на линуксе и есть одно небольшое отличие, вопрос не смертельное ли оно unsure.gif

2All: Уважаемые, не могли бы вы объяснить, в чем суть различий??
Почему на ATxmega работать не будет??
Очень интересно понять смысл вопроса, не выкидывать же многотысячные строки дизасемблера в форум для принятия решения, будет работать на ATxmega или нет..
xelax
Одна и таже версия компилятора, должна давать одинаковый код для одного и того же target на любых host платформах.

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

Что-то вы недособирали для gcc под Ubuntu. Или наоборот не те патчи наложили.


Версия binutils другая, не все патчи установились laughing.gif
kurtis
Binutils не влияет на генерацию кода, ассемблерный код генерирует компилятор.

А проекты скомпилированные под Убунтой в реальном железе стабильно работают?
alex1979
Цитата(kurtis @ Jul 1 2009, 14:53) *
Binutils не влияет на генерацию кода, ассемблерный код генерирует компилятор.

А проекты скомпилированные под Убунтой в реальном железе стабильно работают?


К сожалению пока нет проектов скомпилированных под убунтой в реальном железе crying.gif
aesok
Цитата(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 и должен быть обнулен в стартап коде после использования.

Анатолий.
alex1979
Хочу заметить , что регистр RAMPZ всетаки обнуляется инструкциями
Код
.......
      a2:    00 e0           ldi    r16, 0x00; 0
      a4:    0b bf           out    0x3b, r16; 59
......
aesok
Цитата(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


Анатолий.
alex1979
вопрос скорее к Анатолию.

нашел конструкцию, которая отвечает за обнуление 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. прикладываю весь файл
aesok
Цитата(alex1979 @ Jul 2 2009, 15:31) *
остается вопрос - это правильно или как.


Да эта инструкция необходима, я дал развернутый ответ в посте #9

Анатолий.
alex1979
Цитата(aesok @ Jul 2 2009, 19:35) *
Да эта инструкция необходима, я дал развернутый ответ в посте #9

Анатолий.

задавая вопрос это правильно или как, я имел в виду директивы условной компиляции, которыми окружена команда обнуления регистра
aesok
Цитата(alex1979 @ Jul 3 2009, 00:32) *
задавая вопрос это правильно или как, я имел в виду директивы условной компиляции, которыми окружена команда обнуления регистра

Да правально, хотя лучшей читаемости кода было бы логично добавть в GCC макрос __AVR_HAVE_MORE_64K_RAM__ и использовать его здесь.

Анатолий.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.