|
Написание плагинов к кросскомпилятору GCC |
|
|
|
Nov 16 2013, 17:17
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 16-08-13
Из: Ставрополь
Пользователь №: 77 934

|
Цитата(MrYuran @ Nov 15 2013, 16:13)  Это зависит от длины байта  В военное время может достигать числа Пи Смех смехом, но я про то, что в скрипт придётся пихать информацию о том, что uint16_t весит 16 бит, а uint8_t таки 8, т.е. делать вручную то, что компилятор уже знает. Лениво мне за компилятор работать, вот и пытаюсь оценить, что обойдётся "меньшей кровью" -- писать плагин к компилятору, или писать кусок компилятора. Цитата(_Pasha @ Nov 15 2013, 16:25)  Дык я же и говорю: хватит флудить. Вместо того, чтобы выложить куски проблемного кода, Вы пытаетесь напеть Карузо по телеграфу OK, в понедельник зашлю куски кода.
|
|
|
|
|
Nov 16 2013, 17:29
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(fatlortroll @ Nov 16 2013, 20:17)  Смех смехом, но я про то, что в скрипт придётся пихать информацию о том, что uint16_t весит 16 бит, а uint8_t таки 8, т.е. делать вручную то, что компилятор уже знает. Лениво мне за компилятор работать, вот и пытаюсь оценить, что обойдётся "меньшей кровью" -- писать плагин к компилятору, или писать кусок компилятора. вот - читаешь Ваши умозаключения - и видно, что они слишком сложные. Почему именно, - непонятно, пока не увидим код, т.е. видны признаки, что Вы не использовали какой-то простейший прием программирования и это привело Вас к противоречиям.
|
|
|
|
|
Nov 18 2013, 05:12
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 16-08-13
Из: Ставрополь
Пользователь №: 77 934

|
Цитата(AHTOXA @ Nov 16 2013, 23:23)  Вы, вероятно, пропустили моё сообщение на прошлой странице. Там вариант с самой малой кровью. Прошу прощения, банально позабыл. Пятница была, всё же. :-) Вот куски кода: Код 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*, то скрипту надо узнать её тип, и размер. Сейчас они явно указываются в самой структуре и комментарии, но есть вероятность ошибиться, или просто забыть обновить информацию после смены типа переменной, или размера массива. Вот я и захотел это дело автоматизировать. А поскольку лучше компилятора никто не знает, что творится в коде -- отдать эту работу ему. Ну и просто интересно стало, как же пишутся плагины на кросскомпилятор. Цитата(klen @ Nov 17 2013, 23:05)  голосую неистово за вариант от AHTOXA но ради разнообразия предложе еще вариант после генерации бинаря линкер если ему сказать выплевывает мап файл с указанием всех объектов програмки их адресов и размеров. Ваш скрипт может пройтись по нему и вытащить размеры чего угодно. таким образом автоматически решится вопрос с размерами структур и тп отправляемых по шинке во внешний мир, .... добавили поле , сгенирили бинарь -скрипт опять автоматом прошелся и обновил размнр пакетика... я бы так сделал бы. Идея интересная, спасибо. Но в выхлопе map-файла указывается только общий размер массива/структуры. Есть ли возможность попросить у компилятора более подробную информацию о них? Размеры полей структуры, размер элемента массива.
|
|
|
|
|
Nov 18 2013, 06:16
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
а, ну тогда заполняйте таким образом Код 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 заполнять
|
|
|
|
|
Nov 18 2013, 06:33
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 16-08-13
Из: Ставрополь
Пользователь №: 77 934

|
Цитата(_Pasha @ Nov 18 2013, 10:16)  Код {0x00, (void*) &TestStruct, A_R | A_W, sizeof(TestStruct)}, // "TestStruct" Команды желательно сразу в enum задать Поля желаьельно сразу из-под #define заполнять Хе... Так скрипт вместо размера увидит это самое sizeof(TestStruct), и, вдогонку, не узнает количество полей в той структуре, или элементов в массиве. А какой профит от заполнения полей через define-ы?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|