Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: avrgcc как воткнуть бинарные данные в прошивку
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
viakon
Есть бинарный файл надо чтобы эти данные попали в прошивку контроллера, и могли быть использованы основной программой.
S_agent
утилита bin2c поможет Вам. Результатом ее выполнения будет массив данных на С, который можно включить в проект
еще можно слинковать бинарные данные к проекту.
alx2
Цитата(S_agent @ Jan 29 2009, 13:31) *
утилита bin2c поможет Вам. Результатом ее выполнения будет массив данных на С, который можно включить в проект
еще можно слинковать бинарные данные к проекту.
Зачем так сложно? В комплекте binutils уже есть утилита objcopy, которая позволяет преобразовать бинарный файл сразу в объектный elf-файл, который можно прилинковать к программе. Для доступа к данным из программы objcopy создает символы _binary_xxx_start, _binary_xxx_end и _binary_xxx_size. В документации это все описано.

Или под линковкой бинарных данных к проекту именно это и подразумевалось? Тогда присоединяюсь. smile.gif
Terminator
Цитата(S_agent @ Jan 29 2009, 14:31) *
утилита bin2c поможет Вам. Результатом ее выполнения будет массив данных на С, который можно включить в проект
еще можно слинковать бинарные данные к проекту.

Делал почти также, только данные почему-то ограничиваются в 64к.
Если сделать *.S файл с данными, то без проблем.
viakon
Цитата(alx2 @ Jan 29 2009, 20:13) *
Для доступа к данным из программы objcopy создает символы _binary_xxx_start , _binary_xxx_end и _binary_xxx_size. В документации это все описано.

Прилинковать сумел, как использовать не пойму. _binary_xxx_start и др. не находятся
ARV
внедрение бинарных данных большого объема таит в себе небольшую проблемку, связанную с avr-libc. дело в том, что по умолчанию эти данные линкуются в область младших адресов, а многие функции avr-libc (работающие со строками во флеш, например) сделаны так, чтобы строки находились только в этих младших 64К, точно так же, как и функции для обращения к флеш (pgm_read_byte() например) не работают со старшими адресами флеш... так что не попадите на грабли!
Сергей Борщ
Цитата(viakon @ Jan 30 2009, 08:01) *
_binary_xxx_start и др. не находятся
avr-objdump поможет посмотреть имена всех символов, определенных в получившемся у вас файле. Или выкладывайте минимальный проект.
ARV
Цитата(viakon @ Jan 30 2009, 09:01) *
Прилинковать сумел, как использовать не пойму. _binary_xxx_start и др. не находятся

см. здесь - возможно, чем-то поможет
viakon
extern unsigned int _binary_XXXX_size;
extern PGM_P _binary_XXXX_start;


tpack_count = (unsigned int) (&_binary_XXXX_size) / 38;
tdata = (PGM_P) &_binary_XXXX_start;

в таком виде заработало.
S_agent
Цитата(alx2 @ Jan 29 2009, 16:13) *
Или под линковкой бинарных данных к проекту именно это и подразумевалось? Тогда присоединяюсь. smile.gif


именно так smile.gif
alx2
Цитата(viakon @ Jan 30 2009, 11:01) *
Прилинковать сумел, как использовать не пойму. _binary_xxx_start и др. не находятся
Куда делись?
Код
alx% dd if=/dev/urandom of=test.bin bs=2k count=1
1+0 records in
1+0 records out
2048 bytes transferred in 0.001044 secs (1961620 bytes/sec)
alx% arm-elf-objcopy -I binary -O elf32-littlearm -B arm test.bin test.elf
alx% arm-elf-objdump -t test.elf

test.elf:     file format elf32-littlearm

SYMBOL TABLE:
00000000 l    d  .data  00000000
00000000 g       .data  00000000 _binary_test_bin_start
00000800 g       .data  00000000 _binary_test_bin_end
00000800 g       *ABS*  00000000 _binary_test_bin_size

А, уже после отправки увидел, что проблема решилась. smile.gif
Jeca
Цитата(viakon @ Jan 29 2009, 09:42) *
Есть бинарный файл надо чтобы эти данные попали в прошивку контроллера, и могли быть использованы основной программой.


Мучаюсь с этой-же задачей. Сгенерировал объектный файл, но не удается прилинковать его. avr-gcc ругается "Error 1 avr architecture of input file `FW_cp26m.o' is incompatible with avr:51 output". Не могли бы Вы подсказать как правильно линковать его?
alx2
Код
alx% cat test.c
extern int _binary_data_bin_size;
int main()
{
    return _binary_data_bin_size;
}
alx% dd if=/dev/urandom of=data.bin bs=2k count=1
1+0 records in
1+0 records out
2048 bytes transferred in 0.000354 secs (5784468 bytes/sec)
alx% avr-objcopy -I binary -O elf32-avr data.bin data.elf
alx% avr-gcc -o test test.c data.elf
alx%
Jeca
Спасибо, что ответили. Ваш пример линкуется прекрасно. На я использую ATmega128 и линковка avr-gcc -mmcu=atmega128 -o test test.c data.elf заканчивается:

Error 1 avr architecture of input file `data.elf' is incompatible with avr:51 output.

Я понимаю, что avr-objcopy надо вызывать по-другому, чтобы файл data.elf имел формат avr:51. Правильно ли я думаю и как это сделать?
alx2
Цитата(Jeca @ Jan 9 2012, 21:02) *
Ваш пример линкуется прекрасно. На я использую ATmega128 и линковка avr-gcc -mmcu=atmega128 -o test test.c data.elf заканчивается:

У меня не воспроизводится:
Код
alx% avr-objcopy -I binary -O elf32-avr data.bin data.elf
alx% avr-gcc -mmcu=atmega128 -o test test.c data.elf
alx%


Цитата(Jeca @ Jan 9 2012, 21:02) *
Я понимаю, что avr-objcopy надо вызывать по-другому, чтобы файл data.elf имел формат avr:51. Правильно ли я думаю и как это сделать?

А документацию прочитать? sm.gif Или хотя бы запустить objcopy без параметров? Там же все написано!
Архитектура выходного файла задается опцией -B для objcopy.
Попробуйте в строку с objcopy добавить -B avr:51 чтобы у всех объектных файлов была одна и та же архитектура.
Посмотреть архитектуру elf-файла можно с помощью objdump -f.
Jeca
Цитата(alx2 @ Jan 10 2012, 12:35) *
А документацию прочитать? sm.gif Или хотя бы запустить objcopy без параметров? Там же все написано!
Архитектура выходного файла задается опцией -B для objcopy.
Попробуйте в строку с objcopy добавить -B avr:51 чтобы у всех объектных файлов была одна и та же архитектура.
Посмотреть архитектуру elf-файла можно с помощью objdump -f.


Спасибо большое за помощь! sm.gif Все получилось. Документацию читал, слона то я и не заметил. sm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.