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

 
 
> Написание плагинов к кросскомпилятору GCC
fatlortroll
сообщение Nov 14 2013, 12:00
Сообщение #1


Участник
*

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



Доброго времени суток. Подскажите, чем и как собирать плагины к кроссу GCC? Если хостовым компилятором -- то как плагин узнает о специфичных для платформы типах (могут отличаться по размерам, например, int-ы у хоста и кросса), и не придётся ли собирать по новой как хостовый компилятор, так и кросс (subj собран под линуксом тамошним MinGW, а я сейчас на виндовсе). Если самим кроссом (на что намекают файлы в каталоге /lib/gcc/arm-none-eabi/4.7.4/plugin/include), то как кодогенератор под ARM будет кодогенерировать под самого себя, исполняющегося на x86?
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 23)
Виктория
сообщение Nov 15 2013, 05:43
Сообщение #2


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



fatlortroll, боюсь, что в такой постановке на Ваш вопрос никто не захочет отвечать.

Приведите, хотя бы, пример плагина. Что Вам не хватает в кросскомпиляторе? Какую функцию Вы хотите добавить?

Какая у Вас платформа target-а тоже хорошо бы указать.


З.Ы.: почему у Вас такой странный ник? Троллю могут и не помочь, по доброте душевной. Публика на этом форуме - очень серьезные дяди.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Nov 15 2013, 05:53
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Виктория @ Nov 15 2013, 08:43) *
З.Ы.: почему у Вас такой странный ник? Троллю могут и не помочь, по доброте душевной. Публика на этом форуме - очень серьезные дяди.

a14.gif
ибо товарисчь, сходимши по даденой им же ж самим ссылке, не в силАх прочитать докУмент How-to-build-toolchain.pdf lol.gif
Go to the top of the page
 
+Quote Post
fatlortroll
сообщение Nov 15 2013, 06:04
Сообщение #4


Участник
*

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



От кросса мне хотелось бы создание файла конфигурации по C-шной структуре. Внутри контроллера живёт некое подобие MODBUS, и общается с внешним миром. Внешняя общалка использует сгенерированный файл с описанием данных и функций. Сейчас этот файл генерируется внешним скриптом, но скрипт не может знать, сколько байт в, например, int-е контроллера. Оттого и хочется генерировать файл плагином. Ему можно явно сказать sizeof(int), и размер посчитается без участия человека.

Целевая платформа -- STM32F373.

Ник -- привет из прошлого. Он мне дорог, как память. :-)

Цитата(_Pasha @ Nov 15 2013, 09:53) *
a14.gif
ибо товарисчь, сходимши по даденой им же ж самим ссылке, не в силАх прочитать докУмент How-to-build-toolchain.pdf lol.gif


How to build-то я прочитать могу, и даже прочитал. Но меня интересует техническая сторона вопроса. Придётся ли пересобирать с нуля ещё и хостовый компилятор? Откуда хостовый компилятор, если им собирать плагин, узнает размеры базовых типов платформы кросса? Зачем в каталогах кросса такие подробные include для создания плагинов? Не хочется биться лбом в стену -- может, рядом есть дверь, да я её не вижу.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Nov 15 2013, 06:14
Сообщение #5


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(fatlortroll @ Nov 15 2013, 10:04) *
От кросса мне хотелось бы создание файла конфигурации по C-шной структуре. Внутри контроллера живёт некое подобие MODBUS, и общается с внешним миром. Внешняя общалка использует сгенерированный файл с описанием данных и функций. Сейчас этот файл генерируется внешним скриптом, но скрипт не может знать, сколько байт в, например, int-е контроллера. Оттого и хочется генерировать файл плагином. Ему можно явно сказать sizeof(int), и размер посчитается без участия человека.


В вещах, общающихся с внешним миром, нормальные люди не используют встроенные типы.
Для обеспечения детерминированности размеров полей пользуются <stdint.h>
В связи с чем -подозрение, что Вы вообще крайне далеки от программирования. Начните плз с более простых вопросов.
И собирать компилятор - задача нетривиальная, она к Вашему вопросу никаким боком не относится.
Go to the top of the page
 
+Quote Post
fatlortroll
сообщение Nov 15 2013, 06:26
Сообщение #6


Участник
*

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



Цитата(_Pasha @ Nov 15 2013, 10:14) *
В вещах, общающихся с внешним миром, нормальные люди не используют встроенные типы.
Для обеспечения детерминированности размеров полей пользуются <stdint.h>
В связи с чем -подозрение, что Вы вообще крайне далеки от программирования. Начните плз с более простых вопросов.
И собирать компилятор - задача нетривиальная, она к Вашему вопросу никаким боком не относится.


Что было в ТЗ, то и использую. Это уж не мне решать.

Внезапно, наружу могут отдаваться не только целочисленные, но и с плавающей точкой. В любом случае внешнему скрипту надо будет знать, сколько байт в том же uint16_t, то есть реализовывать часть парсера C / C++. А ещё POD-структуры наружу могут отдаваться. И массивы. С ними что прикажете делать?

Подозрения -- штука такая, сродни гаданию по юзерпику.

Ничего особо сакрального в сборке компилятора нет, всё уже давно расписано, и готовые скрипты сборки лежат на каждом углу. Мне хочется знать, есть ли смысл во всё это ввязываться, или пусть уже по старинке, руками, прописывать размеры данных.
Go to the top of the page
 
+Quote Post
Виктория
сообщение Nov 15 2013, 06:28
Сообщение #7


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



Цитата(fatlortroll @ Nov 15 2013, 09:04) *
Ник -- привет из прошлого. Он мне дорог, как память. :-)


Ух-ты! Предыдущая реализация??? ;-)

Цитата
От кросса мне хотелось бы создание файла конфигурации по C-шной структуре. Внутри контроллера живёт некое подобие MODBUS, и общается с внешним миром. Внешняя общалка использует сгенерированный файл с описанием данных и функций. Сейчас этот файл генерируется внешним скриптом, но скрипт не может знать, сколько байт в, например, int-е контроллера. Оттого и хочется генерировать файл плагином. Ему можно явно сказать sizeof(int), и размер посчитается без участия человека.


То есть плагин должен сгенерировать некий файл данных?
Кросскомпилятор знает всю информацию о генерируемых кодах, почему бы ему не сгенерировать?
Я сомневаюсь в необходимости разработки такого плагина. Разве в ключах компилятора нет такой возможности?

Go to the top of the page
 
+Quote Post
_Pasha
сообщение Nov 15 2013, 06:35
Сообщение #8


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(fatlortroll @ Nov 15 2013, 10:26) *
Что было в ТЗ, то и использую. Это уж не мне решать.

biggrin.gif Колоссально!©
Go to the top of the page
 
+Quote Post
fatlortroll
сообщение Nov 15 2013, 06:42
Сообщение #9


Участник
*

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



Цитата(Виктория @ Nov 15 2013, 10:28) *
Ух-ты! Предыдущая реализация??? ;-)

Не понял, о чём Вы, но на всяк.случ. :-)

То есть плагин должен сгенерировать некий файл данных?
Кросскомпилятор знает всю информацию о генерируемых кодах, почему бы ему не сгенерировать?
Я сомневаюсь в необходимости разработки такого плагина. Разве в ключах компилятора нет такой возможности?


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

Цитата(_Pasha @ Nov 15 2013, 10:35) *
biggrin.gif Колоссально!©


Может, хватит флудить? Виктория, вот, убеждает меня, что тут исключительно серьёзные люди живут. Или вы тут так, проездом?
Go to the top of the page
 
+Quote Post
Виктория
сообщение Nov 15 2013, 06:57
Сообщение #10


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



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


С размером данных вроде бы все понятно, так как эта информация у кросскомпилятора есть. Но, ведь, как я понимаю, нужна ещё конкретная инфа от контроллера о тегах и фукциональных кодах? Как это передать? Вытащить наружу таблицу символов линковщика? Не уверена, насколько это "красиво" и "колоссально"... Попробовать можно.
Go to the top of the page
 
+Quote Post
fatlortroll
сообщение Nov 15 2013, 07:14
Сообщение #11


Участник
*

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



Цитата(Виктория @ Nov 15 2013, 10:57) *
Но, ведь, как я понимаю, нужна ещё конкретная инфа от контроллера о тегах и фукциональных кодах? Как это передать? Вытащить наружу таблицу символов линковщика?

Нет, этого, пожалуй, не требуется. Если очень кратко -- то структура в контроллере содержит следующие поля: номер, под которым структура значится в массиве; адрес переменной (или функции), приведённый к void*; доступ к переменной (функции) -- чтение/запись/выполнение; длина в байтах переменной (для функции неактуально). В сгенерированный файл пишется: имя переменной (или функции); идентификация поля, как переменной, или функции; номер структуры; кодовое обозначение типа данных для переменной; длина переменной в байтах.
Уф... Вроде, всё. Из этого файла общалка формирует запросы к контроллеру, а тот пытается их обработать в соответствии с полями структуры.
Go to the top of the page
 
+Quote Post
msalov
сообщение Nov 15 2013, 08:16
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(fatlortroll @ Nov 15 2013, 09:26) *
Внезапно, наружу могут отдаваться не только целочисленные, но и с плавающей точкой. В любом случае внешнему скрипту надо будет знать, сколько байт в том же uint16_t

Вообще-то упомянутые вами типы данных строго определены стандартом. Во floate 4 байта на всех платформах, а в uint16_t 16 бит (2 байта) тоже на всех платформах. Потому что эти типы вводились как раз для переносимости между платформами. Может отличаться только порядок байт.

ISO/IEC 9899
Цитата
7.18.1.1 Exact-width integer types
1 The typedef name intN_t designates a signed integer type with width N, no padding
bits, and a two’s complement representation. Thus, int8_t denotes a signed integer
type with a width of exactly 8 bits.
2 The typedef name uintN_t designates an unsigned integer type with width N. Thus,
uint24_t denotes an unsigned integer type with a width of exactly 24 bits.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 15 2013, 08:28
Сообщение #13


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(fatlortroll @ Nov 15 2013, 12:04) *
От кросса мне хотелось бы создание файла конфигурации по C-шной структуре. Внутри контроллера живёт некое подобие MODBUS, и общается с внешним миром. Внешняя общалка использует сгенерированный файл с описанием данных и функций. Сейчас этот файл генерируется внешним скриптом, но скрипт не может знать, сколько байт в, например, int-е контроллера. Оттого и хочется генерировать файл плагином. Ему можно явно сказать sizeof(int), и размер посчитается без участия человека.


При помощи команды
Код
    arm-none-eabi-gcc -dM -E - < /dev/null

скрипт может узнать у компилятора размер инта. Наверное так ваша задача может быть решена быстрее.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
fatlortroll
сообщение Nov 15 2013, 08:31
Сообщение #14


Участник
*

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



Цитата(msalov @ Nov 15 2013, 12:16) *
Вообще-то упомянутые вами типы данных строго определены стандартом. Во floate 4 байта на всех платформах, а в uint16_t 16 бит (2 байта) тоже на всех платформах. Потому что эти типы вводились как раз для переносимости между платформами. Может отличаться только порядок байт.


float и double, если я не ошибаюсь, могут иметь одинаковый размер, а могут и разный. По крайней мере мне вспоминается, что на AVR sizeof(float) == sizeof(double). И опять же, не хочется выносить во внешний скрипт часть парсера C-C++, хочется отдать максимум работы компилятору.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Nov 15 2013, 12:13
Сообщение #15


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(fatlortroll @ Nov 15 2013, 10:26) *
В любом случае внешнему скрипту надо будет знать, сколько байт в том же uint16_t

Это зависит от длины байта sm.gif
В военное время может достигать числа Пи


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Nov 15 2013, 12:25
Сообщение #16


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(fatlortroll @ Nov 15 2013, 09:42) *
Может, хватит флудить? Виктория, вот, убеждает меня, что тут исключительно серьёзные люди живут. Или вы тут так, проездом?

Дык я же и говорю: хватит флудить. Вместо того, чтобы выложить куски проблемного кода, Вы пытаетесь напеть Карузо по телеграфу
Go to the top of the page
 
+Quote Post
fatlortroll
сообщение Nov 16 2013, 17:17
Сообщение #17


Участник
*

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



Цитата(MrYuran @ Nov 15 2013, 16:13) *
Это зависит от длины байта sm.gif
В военное время может достигать числа Пи

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

Цитата(_Pasha @ Nov 15 2013, 16:25) *
Дык я же и говорю: хватит флудить. Вместо того, чтобы выложить куски проблемного кода, Вы пытаетесь напеть Карузо по телеграфу

OK, в понедельник зашлю куски кода.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Nov 16 2013, 17:29
Сообщение #18


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



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

вот - читаешь Ваши умозаключения - и видно, что они слишком сложные. Почему именно, - непонятно, пока не увидим код, т.е. видны признаки, что Вы не использовали какой-то простейший прием программирования и это привело Вас к противоречиям.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 16 2013, 19:23
Сообщение #19


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(fatlortroll @ Nov 16 2013, 23:17) *
Лениво мне за компилятор работать, вот и пытаюсь оценить, что обойдётся "меньшей кровью" -- писать плагин к компилятору, или писать кусок компилятора.

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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
klen
сообщение Nov 17 2013, 19:05
Сообщение #20


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



голосую неистово за вариант от AHTOXA
но ради разнообразия предложе еще вариант
после генерации бинаря линкер если ему сказать выплевывает мап файл с указанием всех объектов програмки их адресов и размеров. Ваш скрипт может пройтись по нему и вытащить размеры чего угодно. таким образом автоматически решится вопрос с размерами структур и тп отправляемых по шинке во внешний мир, .... добавили поле , сгенирили бинарь -скрипт опять автоматом прошелся и обновил размнр пакетика...
я бы так сделал бы.
Go to the top of the page
 
+Quote Post
fatlortroll
сообщение Nov 18 2013, 05:12
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 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-файла указывается только общий размер массива/структуры. Есть ли возможность попросить у компилятора более подробную информацию о них? Размеры полей структуры, размер элемента массива.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Nov 18 2013, 06:16
Сообщение #22


;
******

Группа: Участник
Сообщений: 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 заполнять

Go to the top of the page
 
+Quote Post
fatlortroll
сообщение Nov 18 2013, 06:33
Сообщение #23


Участник
*

Группа: Участник
Сообщений: 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-ы?
Go to the top of the page
 
+Quote Post
psL
сообщение Nov 24 2013, 19:48
Сообщение #24


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390



Можно обойтись и без плагина - использовать один хедер для прошивки устройства и внешней утилиты, но тогда, насколько понимаю, при обновлении прошивки необходимо будет пересобирать внешнюю утилиту.
В этом проблема? Видимо, предполагается включать текущую версию протокола в утилиту как текстовый файл?
Как вариант, можно передавать изменения через динамическую библиотеку, которая собирается с хедером текущей версии прошивки (протокола обмена). В этом случае внешняя утилита сможет даже загружать версию библиотеки, соответствующую версии прошивки (если команда опроса версии будет одинаковой для всех версий протокола).
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 04:13
Рейтинг@Mail.ru


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