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

 
 
 
Reply to this topicStart new topic
> Ресурсы в Си
Огурцов
сообщение Dec 13 2012, 09:03
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



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

зы: в VS это элементарно, а тут что-то совсем туплю
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Dec 13 2012, 09:44
Сообщение #2


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

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



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

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


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
hd44780
сообщение Dec 13 2012, 09:45
Сообщение #3


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

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Огурцов, файл-то в каком формате?


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
ReAl
сообщение Dec 14 2012, 07:40
Сообщение #4


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Огурцов @ Dec 13 2012, 11:03) *
Подскажите, как включить в приложение на си (ride7, gcc) какой-то файл с данными, ну и как с ним работать ?

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


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Dec 14 2012, 23:57
Сообщение #5


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



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

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

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

Прикрепленный файл  A4.Bin2C.rar ( 124.14 килобайт ) Кол-во скачиваний: 70

Go to the top of the page
 
+Quote Post
ReAl
сообщение Dec 15 2012, 06:10
Сообщение #6


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



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


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Dec 15 2012, 08:01
Сообщение #7


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



А может ли он обрабатывать не файл, а каталог ? Если нет, то он не подходит. Вообще, из того малого, что я нашел, ничего не подошло.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Dec 15 2012, 09:06
Сообщение #8


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



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


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Dec 15 2012, 09:33
Сообщение #9


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



Цитата(ReAl @ Dec 15 2012, 09:06) *
Так зачем каждый раз искать программу, которая кроме преобразования форматов умеет обрабатывать списки каталогов с масками файлов?
С таким подходом Вам всегда «из того малого, что найдёте» в большинстве случаев ничего не подойдёт.

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

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

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

Go to the top of the page
 
+Quote Post
ReAl
сообщение Dec 15 2012, 09:56
Сообщение #10


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



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

Цитата(Огурцов @ 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


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Dec 15 2012, 10:54
Сообщение #11


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



Цитата(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},
...............
}

Go to the top of the page
 
+Quote Post
ReAl
сообщение Dec 16 2012, 14:40
Сообщение #12


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



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


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Dec 16 2012, 15:43
Сообщение #13


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



Цитата(ReAl @ Dec 16 2012, 14:40) *
Вот так можно сделать то, о чём Вы сейчас написали.

Шаман!

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

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


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

Я бы тоже так сделал, только лень, ибо поставленная задача решена, а сгенеренный .h включается (пока) только один раз.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Dec 18 2012, 12:05
Сообщение #14


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Там ошибочка :-)
Код
    @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 строки можно сразу в инициализаторы структур вставить.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

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

 


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


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