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

Написание плагинов к кросскомпилятору GCC

Может, хватит флудить? Виктория, вот, убеждает меня, что тут исключительно серьёзные люди живут. Или вы тут так, проездом?

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

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


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

Это зависит от длины байта :)

В военное время может достигать числа Пи

Смех смехом, но я про то, что в скрипт придётся пихать информацию о том, что uint16_t весит 16 бит, а uint8_t таки 8, т.е. делать вручную то, что компилятор уже знает. Лениво мне за компилятор работать, вот и пытаюсь оценить, что обойдётся "меньшей кровью" -- писать плагин к компилятору, или писать кусок компилятора.

 

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

OK, в понедельник зашлю куски кода.

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


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

Смех смехом, но я про то, что в скрипт придётся пихать информацию о том, что uint16_t весит 16 бит, а uint8_t таки 8, т.е. делать вручную то, что компилятор уже знает. Лениво мне за компилятор работать, вот и пытаюсь оценить, что обойдётся "меньшей кровью" -- писать плагин к компилятору, или писать кусок компилятора.

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

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


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

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

Вы, вероятно, пропустили моё сообщение на прошлой странице. Там вариант с самой малой кровью.

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


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

голосую неистово за вариант от AHTOXA

но ради разнообразия предложе еще вариант

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

я бы так сделал бы.

 

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


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

Вы, вероятно, пропустили моё сообщение на прошлой странице. Там вариант с самой малой кровью.

 

Прошу прощения, банально позабыл. Пятница была, всё же. :-) Вот куски кода:

 

struct
{
   uint8_t first;
   uint8_t second;
   uint8_t third;
} TestStruct;
const int16_t TestInteger = 9000;
float TestFloat;

struct
{
   const char      command; // Номер переменной
   const void*     addr;        // Указатель на переменную, приведённый к void*
   const char      access;     // Доступ к переменной (чтение/запись)
   const char      len;          // Размер переменной (в байтах), и, после '*', количество подобных переменных в массиве/структуре
} const ptable[] =
{
   //!PT_BEGIN
   {0x00, (void*) &TestStruct,   A_R | A_W, 1 * 3}, //              "TestStruct"
   {0x01, (void*) &TestInteger, A_R,           2},      // (signed) "TestInteger"
   {0xF0, (void*) &TestFloat,     A_R | A_W, }         // (float)    "TestFloat or another text"
};

 

Поскольку указатель на переменную кастуется к void*, то скрипту надо узнать её тип, и размер. Сейчас они явно указываются в самой структуре и комментарии, но есть вероятность ошибиться, или просто забыть обновить информацию после смены типа переменной, или размера массива. Вот я и захотел это дело автоматизировать. А поскольку лучше компилятора никто не знает, что творится в коде -- отдать эту работу ему.

Ну и просто интересно стало, как же пишутся плагины на кросскомпилятор.

 

голосую неистово за вариант от AHTOXA

но ради разнообразия предложе еще вариант

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

я бы так сделал бы.

 

Идея интересная, спасибо. Но в выхлопе map-файла указывается только общий размер массива/структуры. Есть ли возможность попросить у компилятора более подробную информацию о них? Размеры полей структуры, размер элемента массива.

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


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

а, ну тогда заполняйте таким образом

 

struct _interf
{
   uint8_t first;
   uint8_t second;
   uint8_t third;
} TestStruct;

const ptable[] =
{
   //!PT_BEGIN
   {0x00, (void*) &TestStruct,   A_R | A_W, sizeof(TestStruct)}, //              "TestStruct"
   {0x01, (void*) &TestInteger, A_R,  sizeof(TestInteger)},      // (signed) "TestInteger"
   {0xF0, (void*) &TestFloat,     A_R | A_W, sizeof(TestFloat)},         // (float)    "TestFloat or another text"
   {0xF1, &(TestStruct.third), A_R, sizeof(TestStruct.third)}
};

Команды желательно сразу в enum задать

Поля желаьельно сразу из-под #define заполнять

 

 

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


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

   {0x00, (void*) &TestStruct,   A_R | A_W, sizeof(TestStruct)}, //              "TestStruct"

Команды желательно сразу в enum задать

Поля желаьельно сразу из-под #define заполнять

 

Хе... Так скрипт вместо размера увидит это самое sizeof(TestStruct), и, вдогонку, не узнает количество полей в той структуре, или элементов в массиве.

 

А какой профит от заполнения полей через define-ы?

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


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

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

В этом проблема? Видимо, предполагается включать текущую версию протокола в утилиту как текстовый файл?

Как вариант, можно передавать изменения через динамическую библиотеку, которая собирается с хедером текущей версии прошивки (протокола обмена). В этом случае внешняя утилита сможет даже загружать версию библиотеки, соответствующую версии прошивки (если команда опроса версии будет одинаковой для всех версий протокола).

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


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

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

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

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

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

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

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

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

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

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