|
avrgcc как воткнуть бинарные данные в прошивку |
|
|
|
Jan 29 2009, 14:13
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(S_agent @ Jan 29 2009, 13:31)  утилита bin2c поможет Вам. Результатом ее выполнения будет массив данных на С, который можно включить в проект еще можно слинковать бинарные данные к проекту. Зачем так сложно? В комплекте binutils уже есть утилита objcopy, которая позволяет преобразовать бинарный файл сразу в объектный elf-файл, который можно прилинковать к программе. Для доступа к данным из программы objcopy создает символы _binary_xxx_start, _binary_xxx_end и _binary_xxx_size. В документации это все описано. Или под линковкой бинарных данных к проекту именно это и подразумевалось? Тогда присоединяюсь.
Сообщение отредактировал alx2 - Jan 29 2009, 14:15
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Jan 30 2009, 05:22
|

Местный
  
Группа: Участник
Сообщений: 209
Регистрация: 7-12-04
Из: Томск
Пользователь №: 1 382

|
Цитата(S_agent @ Jan 29 2009, 14:31)  утилита bin2c поможет Вам. Результатом ее выполнения будет массив данных на С, который можно включить в проект еще можно слинковать бинарные данные к проекту. Делал почти также, только данные почему-то ограничиваются в 64к. Если сделать *.S файл с данными, то без проблем.
|
|
|
|
|
Jan 30 2009, 06:01
|
Местный
  
Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002

|
Цитата(alx2 @ Jan 29 2009, 20:13)  Для доступа к данным из программы objcopy создает символы _binary_xxx_start , _binary_xxx_end и _binary_xxx_size. В документации это все описано. Прилинковать сумел, как использовать не пойму. _binary_xxx_start и др. не находятся
|
|
|
|
|
Jan 30 2009, 15:47
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(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 А, уже после отправки увидел, что проблема решилась.
Сообщение отредактировал alx2 - Jan 30 2009, 15:55
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Jan 7 2012, 20:15
|
Группа: Участник
Сообщений: 13
Регистрация: 7-01-12
Из: г. Москва
Пользователь №: 69 212

|
Цитата(viakon @ Jan 29 2009, 09:42)  Есть бинарный файл надо чтобы эти данные попали в прошивку контроллера, и могли быть использованы основной программой. Мучаюсь с этой-же задачей. Сгенерировал объектный файл, но не удается прилинковать его. avr-gcc ругается "Error 1 avr architecture of input file `FW_cp26m.o' is incompatible with avr:51 output". Не могли бы Вы подсказать как правильно линковать его?
|
|
|
|
|
Jan 9 2012, 05:36
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Код 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%
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Jan 9 2012, 16:02
|
Группа: Участник
Сообщений: 13
Регистрация: 7-01-12
Из: г. Москва
Пользователь №: 69 212

|
Спасибо, что ответили. Ваш пример линкуется прекрасно. На я использую 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. Правильно ли я думаю и как это сделать?
Сообщение отредактировал IgorKossak - Jan 9 2012, 17:04
Причина редактирования: Бездумное цитирование
|
|
|
|
|
Jan 10 2012, 08:35
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(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. Правильно ли я думаю и как это сделать? А документацию прочитать?  Или хотя бы запустить objcopy без параметров? Там же все написано! Архитектура выходного файла задается опцией -B для objcopy. Попробуйте в строку с objcopy добавить -B avr:51 чтобы у всех объектных файлов была одна и та же архитектура. Посмотреть архитектуру elf-файла можно с помощью objdump -f.
Сообщение отредактировал alx2 - Jan 10 2012, 08:40
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|