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

Ресурсы в Си

Подскажите, как включить в приложение на си (ride7, gcc) какой-то файл с данными, ну и как с ним работать ?

 

зы: в VS это элементарно, а тут что-то совсем туплю

 

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


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

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

 

Если файл один, можно сконвертировать каким-нибудь хекс-редактором, там часто есть "export C/Pascal/ASM". Могу порекомендовать HxD - ничего лишнего и совершенно бесплатно.

Если файлов много, или они регулярно меняются, лучше написать скриптик для srecord.

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


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

Подскажите, как включить в приложение на си (ride7, gcc) какой-то файл с данными, ну и как с ним работать ?

http://electronix.ru/forum/lofiversion/ind...hp/t106379.html

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


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

2 ReAl: спасибо, но мне столько точно не выпить (с)

 

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

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

 

A4.Bin2C.rar

 

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


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

Ну во всяком случае можно было для bin2c (hex2c, ...) использовать srecord -- уже многократно упоминавшийся, в том числе в этой теме.

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


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

А может ли он обрабатывать не файл, а каталог ? Если нет, то он не подходит. Вообще, из того малого, что я нашел, ничего не подошло.

 

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


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

А может ли он обрабатывать не файл, а каталог ? Если нет, то он не подходит. Вообще, из того малого, что я нашел, ничего не подошло.
Вот никогда не интересовался ничем подобным.

 

Что значит «обрабатывать не файл, а каталог»?

Одной специальной программой все файлы из каталога перегнать в кучу файлов с С-массивами?

Тогда Вам нужно сделать с .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-у файлов, включенных в проект. Думаю, и там всё можно сделать до уровня «включил в проект и автоматически подхватилось».

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


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

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

С таким подходом Вам всегда «из того малого, что найдёте» в большинстве случаев ничего не подойдёт.

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

 

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

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

 

 

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


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

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

 

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

 

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

Во время выполнения какого приложения?

make? сам найдёт по указанным правилам.

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

 

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

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

 

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

 

makefile проекта и общая часть для всех в примерх AVR

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


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

Странно. В старючем BC5 были средства, в IAR есть, а в VS нет?

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

 

Или речь не о включении в проект файлов, требующих другого вида обработки, нежели C/asm ?

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

 

Во время выполнения какого приложения?

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

 

общая часть для всех

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

 

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},
...............
}

 

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


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

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

А Вы не могли бы чётче говорить, что Вам нужно?

Я же переспросил: «Что значит „обрабатывать не файл, а каталог”?»

Вы на это ничего не ответили, просто «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+ лет «мейканья». Конечно, в те времена он попроще был, но выручал.

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


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

Вот так можно сделать то, о чём Вы сейчас написали.

Шаман!

 

не знаю, как у Вас организован процесс с самописной программой

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

 

 

Я бы сделал по другому, разбил это Ваше

Я бы тоже так сделал, только лень, ибо поставленная задача решена, а сгенеренный .h включается (пока) только один раз.

 

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


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

Там ошибочка :-)

    @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 строки можно сразу в инициализаторы структур вставить.

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


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

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

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

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

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

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

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

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

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

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