Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ресурсы в Си
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Огурцов
Подскажите, как включить в приложение на си (ride7, gcc) какой-то файл с данными, ну и как с ним работать ?

зы: в VS это элементарно, а тут что-то совсем туплю
esaulenka
Я перегоняю в массив, включаю файл в проект, а далее - как обычно.

Если файл один, можно сконвертировать каким-нибудь хекс-редактором, там часто есть "export C/Pascal/ASM". Могу порекомендовать HxD - ничего лишнего и совершенно бесплатно.
Если файлов много, или они регулярно меняются, лучше написать скриптик для srecord.
hd44780
Огурцов, файл-то в каком формате?
ReAl
Цитата(Огурцов @ Dec 13 2012, 11:03) *
Подскажите, как включить в приложение на си (ride7, gcc) какой-то файл с данными, ну и как с ним работать ?

http://electronix.ru/forum/lofiversion/ind...hp/t106379.html
Огурцов
2 ReAl: спасибо, но мне столько точно не выпить (с)

Цитата(esaulenka @ Dec 13 2012, 10:44) *
Я перегоняю в массив, включаю файл в проект, а далее - как обычно.

В общем так и сделал, как бы это не лениво было

Нажмите для просмотра прикрепленного файла
ReAl
Ну во всяком случае можно было для bin2c (hex2c, ...) использовать srecord -- уже многократно упоминавшийся, в том числе в этой теме.
Огурцов
А может ли он обрабатывать не файл, а каталог ? Если нет, то он не подходит. Вообще, из того малого, что я нашел, ничего не подошло.
ReAl
Цитата(Огурцов @ Dec 15 2012, 10:01) *
А может ли он обрабатывать не файл, а каталог ? Если нет, то он не подходит. Вообще, из того малого, что я нашел, ничего не подошло.
Вот никогда не интересовался ничем подобным.

Что значит «обрабатывать не файл, а каталог»?
Одной специальной программой все файлы из каталога перегнать в кучу файлов с С-массивами?
Тогда Вам нужно сделать с .bin файлами то же самое, что уже делается с .c/.cpp/.S файлами при изготовлении из них .o -- компилятор берет по одному и обрабатывает по одному. А чтобы такая программа, как компилятор, взяла все и обработала всё -- так над ней стоит программа управления проектом (насколько я помню, и в BC5 можно было указать, что для тех-то типов файлов, включенных в проект, нужно предварительлно вызвать такой-то обработчик).
Так зачем каждый раз искать программу, которая кроме преобразования форматов умеет обрабатывать списки каталогов с масками файлов?
С таким подходом Вам всегда «из того малого, что найдёте» в большинстве случаев ничего не подойдёт.
Если я правильно понимаю, именно в этом различие путей, которые сейчас называются unix way и windows way.

Задача «перетоптать все файлы заданного типа из всех указанных каталогов из bin в C» состоит из двух частей
1) «перетоптать все файлы заданного типа из всех указанніх каталогов любым заданным образом»
2) «перетоптать конкретным образом один файл»

1) уже решено на уровне Makefile как минимум для *.c, *.cpp, *.asm файлов. Т.е. это уже решённая задача.
Остаётся найти для 2) нужный перекодировщик.

make (scons по вкусу) хорошо справляется с организацией обработки проектов. В старые добрые времена make помогал ускорить обработку относительно больших схем в pcad 4.5, разбитых на файлы с отдельными листами схем и make не запускал перегонку в netlist или через plt в postscript для тех листов, которые не менялись. Сейчас make помогает на многоядерном процессоре распараллелить обработку отдельных сканированных страниц для последующего склеивания их в pdf (задача по сути абослютно та же, что и с программой -- сначала перегнать отдельные исходники в промежуточный формат, потом их склеить).
Кстати, а предлагаемая Вами bin2c умеет сама распараллеливаться? «Если нет, то не подходит»™

srecord хорошо преобразовывает бинарные форматы
sox хорошо обрабатывает звуковые файлы

Каждая хорошо делает свою работу. И нечего нагружать какую-то из них «несвойственными ей функциями», а потом жаловаться, что именно такой комбинации нет.

p.s[0] «Типичным способом решения какой-либо задачи в Unix является разбить ее на максимально простые подзадачи, каждую из которых умеет решать какая-нибудь известная вам программа, после чего заставить эти программы работать „на конвейере”, передавая свой результат следующей в цепочке.»

p.s[1] Загрузил виртуалку, запустил IAR/STM8 -- на дереве проекта правая кнопка мыша, «Custom build» -- выбрать расширение и команду для обработки незнакомых IAR-у файлов, включенных в проект. Думаю, и там всё можно сделать до уровня «включил в проект и автоматически подхватилось».
Огурцов
Цитата(ReAl @ Dec 15 2012, 09:06) *
Так зачем каждый раз искать программу, которая кроме преобразования форматов умеет обрабатывать списки каталогов с масками файлов?
С таким подходом Вам всегда «из того малого, что найдёте» в большинстве случаев ничего не подойдёт.

Согласен, именно поэтому простые вещи быстрее написать, если оно не решается стандартными (в данном случае, как в VS) средствами, чем найти. Или разобраться. А в следующий раз подправлю пару строчек. Кстати, код занял ровно сто строк.

Цитата(ReAl @ Dec 15 2012, 09:06) *
«Типичным способом решения какой-либо задачи в Unix является разбить ее на максимально простые подзадачи, каждую из которых умеет решать какая-нибудь известная вам программа, после чего заставить эти программы работать „на конвейере”, передавая свой результат следующей в цепочке.»

Ок, как бы вы решили задачу включения проект и работы с неопределенным, но известным на этапе компиляции набором файлов ? Если более конкретно, как бы реализовали поиск нужного файла по его имени во время выполнения приложения ?

ReAl
Так быстрее написать только потому, что ищете не то.

Цитата(Огурцов @ Dec 15 2012, 11:33) *
Согласен, именно поэтому простые вещи быстрее написать, если оно не решается стандартными (в данном случае, как в VS) средствами, чем найти. Или разобраться. А в следующий раз подправлю пару строчек. Кстати, код занял ровно сто строк.
Странно. В старючем BC5 были средства, в IAR есть, а в VS нет? Или речь не о включении в проект файлов, требующих другого вида обработки, нежели C/asm ?

Цитата(Огурцов @ Dec 15 2012, 11:33) *
Ок, как бы вы решили задачу включения проект и работы с неопределенным, но известным на этапе компиляции набором файлов ? Если более конкретно, как бы реализовали поиск нужного файла по его имени во время выполнения приложения ?

Во время выполнения какого приложения?
make? сам найдёт по указанным правилам.
srec_cat или прочего конвертора файлов? Ему make скажет.

Про задачу включения в проект набора файлов, определенного заданным для проекта набором каталогов и масок -- линк в нужную сторону я давал, Вы сказали, что столько не выпьете.
Посмотрите ещё makefile в GCC-примерах scmRTOS — там везде перечень .cpp/.S файлов из указанных каталогов проекта подбирается во время запуска make. С бинарными то же самое, только добавляются маски и правила обработки в духе того $(OBJDIR)/%.o : %.bin

единый makefile в примерах Cortex-M3

makefile проекта и общая часть для всех в примерх AVR
Огурцов
Цитата(ReAl @ Dec 15 2012, 09:56) *
Странно. В старючем BC5 были средства, в IAR есть, а в VS нет?

Впорос был про ride7, в VS есть и совершенно так, как мне надо.

Цитата(ReAl @ Dec 15 2012, 09:56) *
Или речь не о включении в проект файлов, требующих другого вида обработки, нежели C/asm ?

С преобразованем одного файла вопросов нет, верю. А вот как поиметь поиск файлов если их обрабатывать поодиночке не пойму. Как генерится каталог ?

Цитата(ReAl @ Dec 15 2012, 09:56) *
Во время выполнения какого приложения?

Моего приложения, в которое д.б. включены данные из нефиксированного количества файлов с доступом к ним по имени файла.

Цитата(ReAl @ Dec 15 2012, 09:56) *
общая часть для всех

Не вижу ни строчки похожей на типа:

Код
const struct file_entry {
     uint32_t size;
     const unsigned char * pname;
     const unsigned char * pdata;
} catalog [file_count] = {
    {file_1_size, file_1_name, file_1_data},
    {file_2_size, file_2_name, file_2_data},
...............
}

ReAl
Цитата(Огурцов @ Dec 15 2012, 12:54) *
Не вижу ни строчки похожей на типа:

А Вы не могли бы чётче говорить, что Вам нужно?
Я же переспросил: «Что значит „обрабатывать не файл, а каталог”?»
Вы на это ничего не ответили, просто «OK, а как бы вы решили». А уже потом на другой мой ответ -- «не вижу». Так и никогда не увидите.
При желании Вы всегда сможете придумать еще что-то, что не упоминалось в предыдущих сообщениях темы и опять будет «не вижу», так как ответы даются только на то, о чём уже говорилось и без телепатии дать ответ на то, что Вы при этом думали -- невозможно.

Но, тем не менее, направление было указано в одном из сообщений темы, на которую я дал ссылку. Там кроме objcopy для объектных ещё генерировались h-файлы. Попроще, но генерировались.

Вот так можно сделать то, о чём Вы сейчас написали.
Код
BINEXTS = bin raw
BINDIRS = ./binfiles
BINFILES = $(foreach ext,$(BINEXTS),$(wildcard $(addsuffix /*.$(ext), $(BINDIRS))))
BINNAMES = $(notdir $(BINFILES))

.PHONY: filesys.h

filesys.h :
    @echo ===   Generate $@
    @echo "#define file_count $(words $(BINNAMES))"  >$@
    @echo "$(foreach file,$(BINNAMES),const char $(subst .,_,$(file))[]=\"$(file)\";\n)"  >>$@
    @echo "const struct file_entry {"  >>$@
    @echo "     uint32_t size;"     >>$@
    @echo "     const unsigned char * pname;"  >>$@
    @echo "     const unsigned char * pdata;"  >>$@
    @echo "} catalog[file_count] = {"  >>$@
    @echo "$(foreach file,$(BINNAMES),{$(addprefix $(subst .,_,$(file)),_size, _name, _data)},\n)"  >>$@
    @echo "};"  >>$@

Имеем:
Код
$ ls binfiles/
file1.bin  file2.bin  file3.bin  file4.raw
$ make filesys.h
=== Generate filesys.h
$ cat filesys.h
#define file_count 4
const char file1_bin[]="file1.bin";
const char file2_bin[]="file2.bin";
const char file3_bin[]="file3.bin";
const char file4_raw[]="file4.raw";

const struct file_entry {
     uint32_t size;
     const unsigned char * pname;
     const unsigned char * pdata;
} catalog[file_count] = {
{file1_bin_size, file1_bin_name, file1_bin_data},
{file2_bin_size, file2_bin_name, file2_bin_data},
{file3_bin_size, file3_bin_name, file3_bin_data},
{file4_raw_size, file4_raw_name, file4_raw_data},

};

При таком построении filesys.h будет генерироваться заново при каждой сборке, что не есть хорошо, так как потянет перекомпиляцию зависимого (не знаю, как у Вас организован процесс с самописной программой).
Можно по другому:
Код
filelist:
    @echo ===   Generate filelist.h
    @echo "#define file_count $(words $(BINNAMES))"  >filelist.h
    @echo "$(foreach file,$(BINNAMES),const char $(subst .,_,$(file))[]=\"$(file)\";\n)"  >>filelist.h
и так далее. При этом нужно вручную перегенерировать filelist.h при изменении какого-то из файлов или добавлении/убирании.
Я бы сделал по другому, разбил это Ваше
Код
const struct file_entry {
     uint32_t size;
     const unsigned char * pname;
     const unsigned char * pdata;
} catalog [file_count] = {
    {file_1_size, file_1_name, file_1_data},
    {file_2_size, file_2_name, file_2_data},
...............
}
на два файла, .c и .h. В .h только
Код
typedef struct file_entry_t {
     uint32_t size;
     const unsigned char * pname;
     const unsigned char * pdata;
};
#define file_count что там выйдет
extern const  file_entry_t catalog [file_count];
Каждый из двоичных файлов перегнал бы в отдельный соответствующий .c и filelist.h filelist.c поставил бы в зависимость от полного списка этих c-файлов.
При добавлении bin/raw файла список становился бы другим, причём добавленный файл оказывался бы новее, чем filelist и была бы автоматическая перегенерация только когда надо. Само собой при изменении какого-то из бинарных тоже перекомпиляция. В остальных случаях без лишних телодвижений.

А вообще ребята правы, пора переходить с make на scons. Только вломно после 25+ лет «мейканья». Конечно, в те времена он попроще был, но выручал.
Огурцов
Цитата(ReAl @ Dec 16 2012, 14:40) *
Вот так можно сделать то, о чём Вы сейчас написали.

Шаман!

Цитата(ReAl @ Dec 16 2012, 14:40) *
не знаю, как у Вас организован процесс с самописной программой

Просто - запускаю руками перегенерацию при измении данных.


Цитата(ReAl @ Dec 16 2012, 14:40) *
Я бы сделал по другому, разбил это Ваше

Я бы тоже так сделал, только лень, ибо поставленная задача решена, а сгенеренный .h включается (пока) только один раз.
ReAl
Там ошибочка :-)
Код
    @echo "$(foreach file,$(BINNAMES),const char $(subst .,_,$(file))[]=\"$(file)\";\n)"  >>$@
надо заменить на
Код
    @echo "$(foreach file,$(BINNAMES),const char $(subst .,_,$(file))_name[]=\"$(file)\";\n)"  >>$@
чтобы было
Код
const char file1_bin_name[]="file1.bin";
const char file2_bin_name[]="file2.bin";
const char file3_bin_name[]="file3.bin";
const char file4_raw_name[]="file4.raw";

Впрочем, не для AVR с его __flash/PROGMEM строки можно сразу в инициализаторы структур вставить.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.