реклама на сайте
подробности

 
 
> avrgcc как воткнуть бинарные данные в прошивку
viakon
сообщение Jan 29 2009, 05:42
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002



Есть бинарный файл надо чтобы эти данные попали в прошивку контроллера, и могли быть использованы основной программой.
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 15)
S_agent
сообщение Jan 29 2009, 08:31
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 208
Регистрация: 6-10-05
Из: Ukraine, Kiev
Пользователь №: 9 300



утилита bin2c поможет Вам. Результатом ее выполнения будет массив данных на С, который можно включить в проект
еще можно слинковать бинарные данные к проекту.
Go to the top of the page
 
+Quote Post
alx2
сообщение Jan 29 2009, 14:13
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 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. В документации это все описано.

Или под линковкой бинарных данных к проекту именно это и подразумевалось? Тогда присоединяюсь. smile.gif

Сообщение отредактировал alx2 - Jan 29 2009, 14:15


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
Terminator
сообщение Jan 30 2009, 05:22
Сообщение #4


Местный
***

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



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

Делал почти также, только данные почему-то ограничиваются в 64к.
Если сделать *.S файл с данными, то без проблем.
Go to the top of the page
 
+Quote Post
viakon
сообщение Jan 30 2009, 06:01
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 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 и др. не находятся
Go to the top of the page
 
+Quote Post
ARV
сообщение Jan 30 2009, 06:05
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



внедрение бинарных данных большого объема таит в себе небольшую проблемку, связанную с avr-libc. дело в том, что по умолчанию эти данные линкуются в область младших адресов, а многие функции avr-libc (работающие со строками во флеш, например) сделаны так, чтобы строки находились только в этих младших 64К, точно так же, как и функции для обращения к флеш (pgm_read_byte() например) не работают со старшими адресами флеш... так что не попадите на грабли!


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 30 2009, 06:40
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(viakon @ Jan 30 2009, 08:01) *
_binary_xxx_start и др. не находятся
avr-objdump поможет посмотреть имена всех символов, определенных в получившемся у вас файле. Или выкладывайте минимальный проект.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
ARV
сообщение Jan 30 2009, 07:21
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(viakon @ Jan 30 2009, 09:01) *
Прилинковать сумел, как использовать не пойму. _binary_xxx_start и др. не находятся

см. здесь - возможно, чем-то поможет


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
viakon
сообщение Jan 30 2009, 09:22
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002



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;

в таком виде заработало.
Go to the top of the page
 
+Quote Post
S_agent
сообщение Jan 30 2009, 12:13
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 208
Регистрация: 6-10-05
Из: Ukraine, Kiev
Пользователь №: 9 300



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


именно так smile.gif
Go to the top of the page
 
+Quote Post
alx2
сообщение Jan 30 2009, 15:47
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 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

А, уже после отправки увидел, что проблема решилась. smile.gif

Сообщение отредактировал alx2 - Jan 30 2009, 15:55


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
Jeca
сообщение Jan 7 2012, 20:15
Сообщение #12





Группа: Участник
Сообщений: 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". Не могли бы Вы подсказать как правильно линковать его?
Go to the top of the page
 
+Quote Post
alx2
сообщение Jan 9 2012, 05:36
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Jeca
сообщение Jan 9 2012, 16:02
Сообщение #14





Группа: Участник
Сообщений: 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
Причина редактирования: Бездумное цитирование
Go to the top of the page
 
+Quote Post
alx2
сообщение Jan 10 2012, 08:35
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 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. Правильно ли я думаю и как это сделать?

А документацию прочитать? sm.gif Или хотя бы запустить objcopy без параметров? Там же все написано!
Архитектура выходного файла задается опцией -B для objcopy.
Попробуйте в строку с objcopy добавить -B avr:51 чтобы у всех объектных файлов была одна и та же архитектура.
Посмотреть архитектуру elf-файла можно с помощью objdump -f.

Сообщение отредактировал alx2 - Jan 10 2012, 08:40


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
Jeca
сообщение Jan 10 2012, 19:32
Сообщение #16





Группа: Участник
Сообщений: 13
Регистрация: 7-01-12
Из: г. Москва
Пользователь №: 69 212



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


Спасибо большое за помощь! sm.gif Все получилось. Документацию читал, слона то я и не заметил. sm.gif
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 08:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01523 секунд с 7
ELECTRONIX ©2004-2016