Перейти к содержанию
    

avr-gcc Ubuntu 8.10

Собрал 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

Изменено пользователем alex1979

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Собрал avr-gcc под Ubuntu.

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

...

разница в одну команду out 0x3b, r1 ; 59

 

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

 

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

 

Анатолий.

Изменено пользователем aesok

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Анатолий.

 

в обозримом будущем буду применять ATmega. :rolleyes: спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

2All: Уважаемые, не могли бы вы объяснить, в чем суть различий??

Почему на ATxmega работать не будет??

Очень интересно понять смысл вопроса, не выкидывать же многотысячные строки дизасемблера в форум для принятия решения, будет работать на ATxmega или нет..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Одна и таже версия компилятора, должна давать одинаковый код для одного и того же target на любых host платформах.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Одна и таже версия компилятора, должна давать одинаковый код для одного и того же target на любых host платформах.

 

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

 

Версия binutils другая, не все патчи установились :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Binutils не влияет на генерацию кода, ассемблерный код генерирует компилятор.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Binutils не влияет на генерацию кода, ассемблерный код генерирует компилятор.

 

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

 

К сожалению пока нет проектов скомпилированных под убунтой в реальном железе :crying:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 и должен быть обнулен в стартап коде после использования.

 

Анатолий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хочу заметить , что регистр RAMPZ всетаки обнуляется инструкциями

.......
      a2:    00 e0           ldi    r16, 0x00; 0
      a4:    0b bf           out    0x3b, r16; 59
......

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хочу заметить , что регистр 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

нашел конструкцию, которая отвечает за обнуление 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

остается вопрос - это правильно или как.

 

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

 

Анатолий.

Изменено пользователем aesok

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Анатолий.

задавая вопрос это правильно или как, я имел в виду директивы условной компиляции, которыми окружена команда обнуления регистра

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

задавая вопрос это правильно или как, я имел в виду директивы условной компиляции, которыми окружена команда обнуления регистра

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

 

Анатолий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...