Jump to content

    

fatlortroll

Участник
  • Content Count

    26
  • Joined

  • Last visited

Everything posted by fatlortroll


  1. Проблемы при линковке C++-кода обычно возникают при попытках использовать декорированные функции, как обычные C-шные. А вообще было бы неплохо в первом же сообщении эти проблемы и продемонстрировать. Пытаться угадать, что-же сломалось без какой-либо информации -- тяжко.
  2. Visual Studio 2010, tcpclient

    Цитатаесть буфер byte[] buffer = new... Он "местного значения" Выделяется память, и не освобождается. Уже проблема. Почему-то выделяется _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. Доброго времени суток. Подскажите, чем и как собирать плагины к кроссу GCC? Если хостовым компилятором -- то как плагин узнает о специфичных для платформы типах (могут отличаться по размерам, например, int-ы у хоста и кросса), и не придётся ли собирать по новой как хостовый компилятор, так и кросс (subj собран под линуксом тамошним MinGW, а я сейчас на виндовсе). Если самим кроссом (на что намекают файлы в каталоге /lib/gcc/arm-none-eabi/4.7.4/plugin/include), то как кодогенератор под ARM будет кодогенерировать под самого себя, исполняющегося на x86?
  10. Цитата(_Pasha @ Nov 18 2013, 10:16) Код   {0x00, (void*) &TestStruct,   A_R | A_W, sizeof(TestStruct)}, //              "TestStruct" Команды желательно сразу в enum задать Поля желаьельно сразу из-под #define заполнять Хе... Так скрипт вместо размера увидит это самое sizeof(TestStruct), и, вдогонку, не узнает количество полей в той структуре, или элементов в массиве. А какой профит от заполнения полей через define-ы?
  11. Цитата(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-файла указывается только общий размер массива/структуры. Есть ли возможность попросить у компилятора более подробную информацию о них? Размеры полей структуры, размер элемента массива.
  12. Float-ядро для double операций

    Цитата(AlexeyT @ Nov 16 2013, 15:18) Вопрос - есть ли способ использовать float-сопроцессор для операций формата double? Хотя бы для самых простых - сложение и вычитание?Если не смутит ссылка на Хабр, то здесь достаточно подробно описаны внутренности чисел с плавающей точкой, и сразу станет ясно, отчего более короткие float не удастся приспособить под работу с double, которые длиннее их.
  13. Цитата(MrYuran @ Nov 15 2013, 16:13) Это зависит от длины байта В военное время может достигать числа Пи Смех смехом, но я про то, что в скрипт придётся пихать информацию о том, что uint16_t весит 16 бит, а uint8_t таки 8, т.е. делать вручную то, что компилятор уже знает. Лениво мне за компилятор работать, вот и пытаюсь оценить, что обойдётся "меньшей кровью" -- писать плагин к компилятору, или писать кусок компилятора. Цитата(_Pasha @ Nov 15 2013, 16:25) Дык я же и говорю: хватит флудить. Вместо того, чтобы выложить куски проблемного кода, Вы пытаетесь напеть Карузо по телеграфу OK, в понедельник зашлю куски кода.
  14. Цитата(msalov @ Nov 15 2013, 12:16) Вообще-то упомянутые вами типы данных строго определены стандартом. Во floate 4 байта на всех платформах, а в uint16_t 16 бит (2 байта) тоже на всех платформах. Потому что эти типы вводились как раз для переносимости между платформами. Может отличаться только порядок байт. float и double, если я не ошибаюсь, могут иметь одинаковый размер, а могут и разный. По крайней мере мне вспоминается, что на AVR sizeof(float) == sizeof(double). И опять же, не хочется выносить во внешний скрипт часть парсера C-C++, хочется отдать максимум работы компилятору.
  15. Прерывания ARM946E

    А как сам контроллер зовут? STM-овский?
  16. Цитата(Виктория @ Nov 15 2013, 10:57) Но, ведь, как я понимаю, нужна ещё конкретная инфа от контроллера о тегах и фукциональных кодах? Как это передать? Вытащить наружу таблицу символов линковщика? Нет, этого, пожалуй, не требуется. Если очень кратко -- то структура в контроллере содержит следующие поля: номер, под которым структура значится в массиве; адрес переменной (или функции), приведённый к void*; доступ к переменной (функции) -- чтение/запись/выполнение; длина в байтах переменной (для функции неактуально). В сгенерированный файл пишется: имя переменной (или функции); идентификация поля, как переменной, или функции; номер структуры; кодовое обозначение типа данных для переменной; длина переменной в байтах. Уф... Вроде, всё. Из этого файла общалка формирует запросы к контроллеру, а тот пытается их обработать в соответствии с полями структуры.
  17. Цитата(Виктория @ Nov 15 2013, 10:28) Ух-ты! Предыдущая реализация??? ;-) Не понял, о чём Вы, но на всяк.случ. :-) То есть плагин должен сгенерировать некий файл данных? Кросскомпилятор знает всю информацию о генерируемых кодах, почему бы ему не сгенерировать? Я сомневаюсь в необходимости разработки такого плагина. Разве в ключах компилятора нет такой возможности? Возможно, будете смеяться и издеваться -- но красивой идеи, как заставить именно кросс генерировать подобный файл в хостовую среду без влезания в сам процесс компиляции (что и делает плагин) у меня нет. Цитата(_Pasha @ Nov 15 2013, 10:35) Колоссально!© Может, хватит флудить? Виктория, вот, убеждает меня, что тут исключительно серьёзные люди живут. Или вы тут так, проездом?
  18. Цитата(_Pasha @ Nov 15 2013, 10:14) В вещах, общающихся с внешним миром, нормальные люди не используют встроенные типы. Для обеспечения детерминированности размеров полей пользуются <stdint.h> В связи с чем -подозрение, что Вы вообще крайне далеки от программирования. Начните плз с более простых вопросов. И собирать компилятор - задача нетривиальная, она к Вашему вопросу никаким боком не относится. Что было в ТЗ, то и использую. Это уж не мне решать. Внезапно, наружу могут отдаваться не только целочисленные, но и с плавающей точкой. В любом случае внешнему скрипту надо будет знать, сколько байт в том же uint16_t, то есть реализовывать часть парсера C / C++. А ещё POD-структуры наружу могут отдаваться. И массивы. С ними что прикажете делать? Подозрения -- штука такая, сродни гаданию по юзерпику. Ничего особо сакрального в сборке компилятора нет, всё уже давно расписано, и готовые скрипты сборки лежат на каждом углу. Мне хочется знать, есть ли смысл во всё это ввязываться, или пусть уже по старинке, руками, прописывать размеры данных.
  19. От кросса мне хотелось бы создание файла конфигурации по C-шной структуре. Внутри контроллера живёт некое подобие MODBUS, и общается с внешним миром. Внешняя общалка использует сгенерированный файл с описанием данных и функций. Сейчас этот файл генерируется внешним скриптом, но скрипт не может знать, сколько байт в, например, int-е контроллера. Оттого и хочется генерировать файл плагином. Ему можно явно сказать sizeof(int), и размер посчитается без участия человека. Целевая платформа -- STM32F373. Ник -- привет из прошлого. Он мне дорог, как память. :-) Цитата(_Pasha @ Nov 15 2013, 09:53) ибо товарисчь, сходимши по даденой им же ж самим ссылке, не в силАх прочитать докУмент How-to-build-toolchain.pdf How to build-то я прочитать могу, и даже прочитал. Но меня интересует техническая сторона вопроса. Придётся ли пересобирать с нуля ещё и хостовый компилятор? Откуда хостовый компилятор, если им собирать плагин, узнает размеры базовых типов платформы кросса? Зачем в каталогах кросса такие подробные include для создания плагинов? Не хочется биться лбом в стену -- может, рядом есть дверь, да я её не вижу.
  20. stm32 АЦП в инжекторном режиме

    Если не менять схему подключения -- то настраиваешь ноги, на которых кнопки, как входы, включаешь подтягивающие к земле резисторы на этих входах (PullDown), и из регистра InputData (он же GPIOx_IDR) считываешь состояния входов. Антидребезг -- по желанию, программный.
  21. I2C в STM32F37, ошибка в железе?

    Доброго времени суток всем. Есть отладочная плата STM32373C, пытаюсь организовать работу её контроллера с EEPROM. При работе с установленными на ней EEPROM-инами случились следующие проблемы: 1. При приёме NACK в режиме Master-Reader не взводится флаг этого самого NACK-а и, соответственно, не вызывается прерывание (прерывания разрешил, TC и TCR, например, взводятся). В режиме Master-Writer при появлении NACK-а на шине глохнут по меньшей мере прерывания I2C и USART (остальные проверять пока лень). 2. После корректной записи в EEPROM по заданному адресу пробую прочитать записанное с того же адреса: функции I2C_TransferHandling задаю канал I2C, адрес EEPROM на шине, количество байт к передаче (2 байта адреса, с которого будет производиться чтение), режим SoftEnd и Generate_Start_Write, после чего настраиваю DMA на передачу этих двух байт адреса чтения. На осциллографе виден сильно другой адрес, не тот, который задан в переменной. Причём, если производить чтение после сброса контроллера -- адрес отдаётся корректный. Первая же запись всё ломает. Сталкивался ли кто с подобными проблемами, и есть ли решения? Если да -- поделитесь. Очень уж неохота программно реализовывать I2C.
  22. I2C в STM32F37, ошибка в железе?

    Цитата(rudy_b @ Oct 28 2013, 16:28) Нормально запустить их I2C (чтобы не взвисало ни в каких ситуациях, в том числе и при отсутствии ACK) удается только путем долгих проб и ошибок. И это без DMA. Что они накрутили там - не знаю и даже думать не хочу. Печально. Так хорошо всё в теории получалось с DMA, и так отвратно на практике. А вообще ST за такую реализацию I2C пинают? Хоть какие подвижки происходят?
  23. I2C в STM32F37, ошибка в железе?

    Цитата(demiurg_spb @ Oct 28 2013, 14:16) Можно ссылку на неё? Например, только для F3xx отдельно искать надо.
  24. stm32 АЦП в инжекторном режиме

    Цитата(demiurg_spb @ Oct 28 2013, 13:52) Бывает и такое... Всё же, хотелось бы услышать непосредственно от автора, какую задачу он решает. Может, действительно её возможно реализовать заметно проще.
  25. stm32 АЦП в инжекторном режиме

    ЦитатаНужно считывать периодически 4 канала (на каждый подключено Vcc через кнопки), таким образом с АЦП по каждому каналу нужно проверять есть ли Vcc или нет Я правильно понял, что для определения, единица на входе, или ноль, используется АЦП? Если да, то это уж очень явный overengineering. Не проще ли инициализировать ноги, как входы, с подтяжкой к земле встроенными резисторами (PullDown), и считывать уже их состояние?