Jump to content

    

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

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

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

Share this post


Link to post
Share on other sites
Это зависит от длины байта :)

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

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

 

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

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

Share this post


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

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

Share this post


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

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

Share this post


Link to post
Share on other sites

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

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

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

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

 

Share this post


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

 

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

 

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-файла указывается только общий размер массива/структуры. Есть ли возможность попросить у компилятора более подробную информацию о них? Размеры полей структуры, размер элемента массива.

Share this post


Link to post
Share on other sites

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

 

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 заполнять

 

 

Share this post


Link to post
Share on other sites
   {0x00, (void*) &TestStruct,   A_R | A_W, sizeof(TestStruct)}, //              "TestStruct"

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

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

 

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

 

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this