LINUX.ORG.RU

перевод С файла в бинарный код. Нужны идеи ))

 , , ,


0

2

Всем привет,

Знаю, что название темы звучит несколько странно. Но что имею:
- XML файл, который с XSLT перевожу в С-Файл со значениями «запакованными» в структуру;
- Прибор, в котором надо перепрограммировать эту структуру со значениями;
- Заказчика, у которого нету нашего компилятора и программатора

Т.е. заказчик хочет что-то поменять в XML файле и перенести эти значения в прибор. Первое, что пришло в голову:
- Написать ещё один XSLT скрипт, который будет генерить питоновский скрипт со значениями из XML файла в текстовой форме. Потом запускается этот скрипт и генерится бинарный файл. Но для этого нужен питон на компе у заказчика
- дать заказчику пакет программ. В этом пакете будет компилятор, и несколько С файлов. Компилятор создаст программу с С-файлом со значениями. А наша С-программа будет писать этот бинарник. Всё бы хорошо, но нужен небольшой компилятор. Попробовал tcc. Он не компилирует мой С-файл. А MinGW больше 400МБ. С ним не пройдёт

Вот сижу, думаю, как такое ещё можно сделать.

Заранее благодарен за идеи.
Велик ))


Думаю, надо допилить файл до совместимости с tcc.
Например, макросы в начало дописать какие-нибудь.

mittorn ★★★★★
()

Ещё можно пропатчить сам tcc, он довольно прост

mittorn ★★★★★
()

Что за бинарник / бинарный файл?

Попробовал tcc. Он не компилирует мой С-файл.

Сделай так, чтобы компилировал.

anonymous
()

Напиши программу, которая будет жрать XML и программировать девайс и отдай её заказчику.

expat - маленькая библиотечка которая умеет парсить XML, вкомпили её статикой. Будет один небольшой бинарник который легко отдать заказчику.

Stanson ★★★★★
()

Прибор, в котором надо перепрограммировать эту структуру со значениями

Другими словами, ты просто хочешь поменять некоторые жёстко запрограммированные значения в прошивке контроллера? Может переписать саму прошивку так, чтобы новые значения можно было отправлять по какому-нибудь стандартному интерфейсу? Наверняка же в контроллере есть EEPROM или флеш, доступный для чтения.

anonymous
()

Развернуть виртуалку со всем необходимым и предоставить доступ к ней заказчику.

Dron ★★★★★
()
Ответ на: комментарий от anonymous

Сделай так, чтобы компилировал.

Пробовал. В оригинале имею: GCC и в начале h-файла стоит:

#if defined __GNUC__
 #pragma pack(push, 1)


т.е. Все структуры этого h-файла запакованы. С gcc всё в порядке. с tcc надо за каждым членом структуры ставить __attribute__((packed)) См. http://stackoverflow.com/questions/28637879/packed-structs-in-tcc

Такое работает для «простых» структур. Но где-то в файле есть следующая структура:
typedef struct
{
    u8   bEnable : 1;
    u16  u16StartTime_Sec : 15;
    u16  u16RunTime_Sec : 15;
} tsControl;

gcc её пакует без лишних слов. Но когда для tcc ставлю этот самый __attribute__((packed)), то получаю ошибку компиляции. Как-то так...

velikS
() автор топика
Ответ на: комментарий от anonymous

Может переписать саму прошивку так, чтобы новые значения можно было отправлять по какому-нибудь стандартному интерфейсу? Наверняка же в контроллере есть EEPROM или флеш, доступный для чтения.

Это STM32. Под структуру со значениями выделил сектор памяти. Бинарная структура занимает 14кБайт. Т.е. дофига. Переписывать структуру буду по UART со своим примитивным протоколом передачи. Но это детали. Щас бы разобраться с тем, как конвертировать XML файл в бинарник с минимальными «потерями»

velikS
() автор топика
Ответ на: комментарий от Stanson

Напиши программу, которая будет жрать XML и программировать девайс и отдай её заказчику

Спасибо. Это - один из вариантов. Просто не хочется пилить что-то монументальное. Ищутся простые пути )))

velikS
() автор топика

У заказчика винда так полагаю, gcc из cygwin попробуй, cygwin упакованный около 100М, наверное если вырезать только необходимое уложишь в 20М. Ну или досовские компиляторы может какие проглотят твои С-файлы.

ilovewindows ★★★★★
()
Ответ на: комментарий от vodz

Это полностью структура? 31 бит? Сама архитектура 32-бит? Так может packed тут и не надо?

Нет. Это только та структура, на которой tcc ругается. Там структура в структуре и ещё много раз в массиве структур. sizeof всего этого добра в итоге получается 14кБ. Паковать надо. Незапакованное занимает больше 30кБ.

Сама архитектура 32-бит?

Да. Cortex-M4

velikS
() автор топика
Ответ на: комментарий от velikS

Ну и замечательно, добавьте ещё dummy:1, на эту подструктуру packed не указывайте, а на остальные - укажите, чтоб работало в tcc.

vodz ★★★★★
()
Ответ на: комментарий от vodz

на эту подструктуру packed не указывайте, а на остальные - укажите, чтоб работало в tcc.

Так если б! Если эту структуру в биты не паковать, то бинарник получается порядка 20кБайт. А у меня лимит 16кБ.

velikS
() автор топика
Ответ на: комментарий от ilovewindows

openwatcom инсталлер 80 метров. я думаю, если его покоцать, то там сильно меньше будет.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от velikS

О как, вы хотите сказать, что tcc не упаковывает битовую структуру по умолчанию? И каков sizeof этой структуры?

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

Фишка в том, что для tcc надо для каждого члена структуры указывать, что надо запаковать. См. выше или http://stackoverflow.com/questions/28637879/packed-structs-in-tcc
Так вот с битовыми полями и с аттрибутом «запаковать» tcc выдаёт ошибку. А для устройства применяю gcc. Он запаковывает без проблем. Т.е., похоже, придётся таки заказчику давать какой-то обрезанный gcc

velikS
() автор топика
Ответ на: комментарий от velikS

Я читал все коментарии. Моя мысль была в том, что если sizeof этой битовой структуры даёт 32, то именно для этой подструктуры packed не надо, собственно битовые структуры для того и существуют, что это стандарт, а _attribute__((packed)) - нет.

vodz ★★★★★
()
Ответ на: комментарий от velikS

кажется что задача по написанию конвертора xml/json в нужного формата бинарный файл в общем то не сложная, хоть вероятно и нудная ввиду количества данных. но по удобству для заказчика это самый лучший путь. иметь небольшую програмку которая запустится и скновертит всё что нужно из какого нибудь человеко-читаемого формата - кажется самое удобное что только можно придумать. удобнее только гуйня в которой поля/галочки для счастья.

xml парсится либо libxml2 либо как уже указали экспатом. либиксэмэль имхо удобнее, но зависит от ситуации.

AndreyKl ★★★★★
()
Последнее исправление: AndreyKl (всего исправлений: 1)
Ответ на: комментарий от vodz

Вот я тормоз! Ваша правда. Эта конструкция:

typedef struct
{
    u8   bEnable : 1;
    u16  u16StartTime_Sec : 15;
    u16  u16RunTime_Sec : 15;
} tsControl;

неправильная. Надо
typedef struct
{
    u32   bEnable : 1;
    u32  u16StartTime_Sec : 15;
    u32  u16RunTime_Sec : 15;
} tsControl;


Тогда tcc выдаёт sizeof этой структуры 4 байта без всяких атрибутов, т.е. так, как вы имели в виду.

Спасибо.
Просто так чёрта лысого заметил бы ошибку )))

velikS
() автор топика
Ответ на: комментарий от AndreyKl

xml парсится либо libxml2 либо как уже указали экспатом. либиксэмэль имхо удобнее, но зависит от ситуации.

Спасибо за идею! Пока хочется обойтись меньшей «кровью», т.е. использовать уже готовый XSLT скрипт, который выдаёт С-файл с иницилизационными значениями. Так, надеюсь, будет меньше ошибок )))

velikS
() автор топика

Т.е. заказчик хочет что-то поменять в XML файле и перенести эти значения в прибор.

Можно ли прибор подключать к компу через USB или COM-порт? Здесь есть варианты. Например сделать на приборе файловую систему или её имитацию, чтобы при подключении прибора в комп генерировался текстовый конфиг, который можно менять и сохранять. Ну или написать на каком-нибудь Qt прогу для PC, которая взаимодействовала бы по COM-порту с прибором и сама предоставляла бы интерфейс для настройки.

grimwaken
()

То что ты хочешь делать называется калибровка. Есть, например, CCP - Can Calibration Protocol. Используется, например в машинах. Нужно давать заказчику приложение, кооторрое читает XML и заливает данные в проц. через UART, CAN или что-то подобное. промежуточный С не нужен.

vromanov ★★★
()
Последнее исправление: vromanov (всего исправлений: 1)

Вы поставляете Заказчику прибор с неким зашитым в него ПО. Прибор надо как-то конфигурировать.

Так напишите нормальный конфигуратор и ПО, которое сможет брать эту конфигурацию.

Не надо Заказчика грузить всякими XML, XSLT, компиляцией .c-файлов, tcc , MinGW, скриптами на питоне и прочей ерундой.

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Не надо Заказчика грузить

Потому и закрывают, чтобы не грузить, как оно там унутри на самом деле. :) Какая разница заказчику, какой там /dev/astral, если ТЗ будет удобно удовлетворять?

vodz ★★★★★
()
Ответ на: комментарий от xpahos

Там baremetal приложение или все же какая-то ОС есть?

Чистый Хардкор. Только FreeRTOS.

velikS
() автор топика
Ответ на: комментарий от pathfinder

Не надо Заказчика грузить всякими XML, XSLT, компиляцией .c-файлов, tcc , MinGW, скриптами на питоне и прочей ерундой.

Полностью с вами согласен. Эта фишка нужна временно. Пока заказчик подберёт нужные ему параметры. Он получит от нас папку с файлами. В верхней папке наше временное приложение, которое само запустит XSLT, сгенерит бинарник с помощью tcc и зальёт этот бинарник в прибор

velikS
() автор топика
Ответ на: комментарий от velikS

Полностью с вами согласен. Эта фишка нужна временно. Пока заказчик подберёт нужные ему параметры. Он получит от нас папку с файлами. В верхней папке наше временное приложение, которое само запустит XSLT, сгенерит бинарник с помощью tcc и зальёт этот бинарник в прибор

А MinGW больше 400МБ. С ним не пройдёт

Больше времени потеряете. 400Мб для SDK на данный момент ерунда. Задача же не стоит постоянно обновлять.

xpahos ★★★★★
()

Можно написать Python скрипт который будет генерить бинарный файл из XML и если у заказчика винда то сделать из скрипта standalone Windows executable program например с помощью py2exe

alx777 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.