Jump to content

    

fatlortroll

Участник
  • Content Count

    26
  • Joined

  • Last visited

Community Reputation

0 Обычный

About fatlortroll

  • Rank
    Участник
  • Birthday 09/29/1982

Информация

  • Город
    Array
  1. Проблемы при линковке C++-кода обычно возникают при попытках использовать декорированные функции, как обычные C-шные. А вообще было бы неплохо в первом же сообщении эти проблемы и продемонстрировать. Пытаться угадать, что-же сломалось без какой-либо информации -- тяжко.
  2. Выделяется память, и не освобождается. Уже проблема. Почему-то выделяется _tcpСlient.Available байт памяти, а читать пытается buffer.Length (кстати, откуда у buffer, который простой массив, берётся Length? как это вообще компилируется?). Ну и в конце концов, отчего не передать в ns.Read указатель на глобальный массив, и его размер? Не надо будет каждый раз выделять память в потоке.
  3. Вот здесь пишут, что привилегированный режим по умолчанию доступен сразу после сброса контроллера: Thread mode is privileged out of reset, but you can change it to user or unprivileged by...
  4. А в прошивке используется выделение памяти на куче (операторы new, new[]), или всё статически на этапе компиляции задаётся?
  5. Массив с изменяемыми данными, или с константами? Насколько сильно отбирает ОЗУ остальная программа? Если добавить-убрать глобальных переменных, расположенных в ОЗУ, размер массива, с которого появляется ошибка, будет изменяться?
  6. Можно и в OpenModelica попрактиковаться. Вполне достойная штука, много примеров, хорошая справочная система.
  7. Ещё с утра смотрел -- не было, а тут вот какая радость! Будем пробовать.
  8. Скопируй ту переменную в оперативку, и изменяй её, как хочешь. И, кстати, используется встроенная flash-память контроллера, как я понимаю? Она, разве, позволяет изменять данные меньше, чем страницей?
  9. Хе... Так скрипт вместо размера увидит это самое sizeof(TestStruct), и, вдогонку, не узнает количество полей в той структуре, или элементов в массиве. А какой профит от заполнения полей через define-ы?
  10. Прошу прощения, банально позабыл. Пятница была, всё же. :-) Вот куски кода: 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*, то скрипту надо узнать её тип, и размер. Сейчас они явно указываются в самой структуре и комментарии, но есть вероятность ошибиться, или просто забыть обновить информацию после смены типа переменной, или размера массива. Вот я и захотел это дело автоматизировать. А поскольку лучше компилятора никто не знает, что творится в коде -- отдать эту работу ему. Ну и просто интересно стало, как же пишутся плагины на кросскомпилятор. Идея интересная, спасибо. Но в выхлопе map-файла указывается только общий размер массива/структуры. Есть ли возможность попросить у компилятора более подробную информацию о них? Размеры полей структуры, размер элемента массива.
  11. Если не смутит ссылка на Хабр, то здесь достаточно подробно описаны внутренности чисел с плавающей точкой, и сразу станет ясно, отчего более короткие float не удастся приспособить под работу с double, которые длиннее их.
  12. Смех смехом, но я про то, что в скрипт придётся пихать информацию о том, что uint16_t весит 16 бит, а uint8_t таки 8, т.е. делать вручную то, что компилятор уже знает. Лениво мне за компилятор работать, вот и пытаюсь оценить, что обойдётся "меньшей кровью" -- писать плагин к компилятору, или писать кусок компилятора. OK, в понедельник зашлю куски кода.
  13. float и double, если я не ошибаюсь, могут иметь одинаковый размер, а могут и разный. По крайней мере мне вспоминается, что на AVR sizeof(float) == sizeof(double). И опять же, не хочется выносить во внешний скрипт часть парсера C-C++, хочется отдать максимум работы компилятору.
  14. А как сам контроллер зовут? STM-овский?
  15. Нет, этого, пожалуй, не требуется. Если очень кратко -- то структура в контроллере содержит следующие поля: номер, под которым структура значится в массиве; адрес переменной (или функции), приведённый к void*; доступ к переменной (функции) -- чтение/запись/выполнение; длина в байтах переменной (для функции неактуально). В сгенерированный файл пишется: имя переменной (или функции); идентификация поля, как переменной, или функции; номер структуры; кодовое обозначение типа данных для переменной; длина переменной в байтах. Уф... Вроде, всё. Из этого файла общалка формирует запросы к контроллеру, а тот пытается их обработать в соответствии с полями структуры.