Перейти к содержанию
    

amaora

Участник
  • Постов

    778
  • Зарегистрирован

  • Посещение

  • Победитель дней

    3

Весь контент amaora


  1. Во FreeRTOS несколько реализаций heap, разной степени примитивности. В этой освобождение блоков не предусмотрено. https://www.freertos.org/a00111.html
  2. Ну такая концепция была, что историю менять нельзя, наверно поэтому название ветки прибито к коммиту. Сейчас уже все можно менять если хочется, но я предпочитаю не делать всяких rebase, mq и подобного. А уж histedit совсем какая-то грязь. Да, есть bookmarks это перемещаемые метки, не пользуюсь, не понимаю зачем они мне. Не пользовался, теперь как я понял она называется breezy.
  3. У меня после mercurial такое же впечатление о git, хотя не должно было, они похожие.
  4. В итоге добавил в объявление функций memset и memcpy атрибуты __attribute__ ((noclone, noinline, used)).
  5. И не нужно, сначала идёт заполнение словами, при условии выравненности адреса, а затем остаток заполняется байтами. Хотя новые компиляторы такое и сами умеют уже при включённой оптимизации.
  6. Нет отдельных библиотек, все исходники под LTO. Но сейчас пробую уже разные варианты. Да, действительно помогает. Тогда можно предположить, что с LTO компилятор делает частную реализацию (какую-то memset.lto_priv.0, которая например всегда заполняет нулями, потому что в коде только так все используют memset с параметром 0), а функции с именем memset не оказывается. 13.2.1 20230826
  7. Проверяю сборку своего проекта для STM32F4 с разным и ключами (уровни оптимизации и lto). Вариант '-Os -flto=auto' ломается со странной проблемой, при этом собираются и работают другие варианты, например '-O3 -flto=auto' или '-Os'. В указанной строке вот это. if (reg->proc != NULL) { reg_t lreg = { .link = &rval }; reg->proc(&lreg, &rval, NULL); } Ну захотелось компилятору сделать memset ну и ладно, он у меня есть и используется в других местах, например во freertos или usb стеке. Но в чем проблема? почему undefined reference когда есть такая функция? void *memset(void *d, int c, size_t n) { uint32_t fill, *ld = (uint32_t *) d; if (((uint32_t) ld & 3U) == 0) { fill = (uint8_t) c; fill |= (fill << 8); fill |= (fill << 16); for (; n >= 4; n -= 4) { *ld++ = fill; } } { uint8_t *bd = (uint8_t *) ld; for (; n >= 1; n -= 1) { *bd++ = (uint8_t) c; } } return d; } Непонятно, что именно он не нашёл. Весь проект только C, нет файлов C++. Вот здесь говорят, что надо собирать свой libc (где лежит код memset) без lto. Как-то вот так странно этот механизм построен, что среди обрабатываемых lto функций линкер не смотрит, а нужен уже скомпилированный код memset. Отучить вставлять libc вызовы туда где их не было, тоже похоже нельзя.
  8. В многопроцессорной системе барьеры вероятно посложнее делаются, здесь только для компилятора указания.
  9. Это где-то явно указано в документации ST или ARM? Что можно писать что угодно?
  10. Дать достаточно тока, чтобы падение на VDD-VSS было около 3.3в 😆 не на долго.
  11. Инвалидация нужна чтобы прочитать rxbuf из памяти а не старые значения из кэша. Да, забираю результат предыдущей транзакции. В моем случае действительно проще объявить все dma данные выровненными. У меня вся RAM кэшируется, MPU не настраивал.
  12. Все получается, велосипед едет. Оказалось необходимо использовать DMA2 (и соответственно TIM8) для доступа к AHB на которой GPIO. Перезапуск передачи (вызов AS5047_get_EP) занимает около ~100 тактов на F4. Добавка: Похоже я как-то криво работаю с кэшами в F7 и не могу найти подробную информацию (ни у ST ни у ARM), в частности по регистрам DCCIMVAC и подобным, можно ли туда невыровненный адрес писать или нет?
  13. Так и собрался делать, нужно четыре или три канала если совместить запись CS=0 и CS=1 на одном. Таблица соединений позволяет так сделать с таймером TIM5. Каналы DMA у меня тоже свободные. У меня есть поддержка и сторонних плат, которые например продаются на али. Хотелось бы меньше зависимостей от аппаратных особенностей, если это возможно.
  14. Да, с таймером был бы минимальный джиттер CS (хотя я не уверен, что это важно для AS5047, не знаю к чему именно у него привязано сэмплирование). Но вот так плата сделана, в качестве CS используется пин на котором нет выхода ни одного таймера.
  15. Все сигналы, что идут в контуры желательно сэмплировать в один момент времени, ну или хотя бы с фиксированным сдвигом в пределах цикла. То же относится и к датчику по SPI, было бы очень некрасиво получить плавающую временную диаграмму обмена по SPI.
  16. Видимо надо четыре канала DMA, два на передачу-прием по SPI, и два на управление NSS путём записи в BSRR регистр GPIO. Судя по таблице соединений запросов DMA можно использовать TIM5, который у меня не занят ничем.
  17. 1. Термостатирование; 2. Гиростабилизированная платформа; 3. Калибровка. Первые два пункта снижают количество и интенсивность воздействующих факторов, которые далее нужно учитывать при калибровке. Брать среднее от нескольких экземпляров тоже можно, но малоэффективно. Уделить внимание сэмплированию и фильтрации, выше уже сказали.
  18. Примерно так да, есть разные конфигурации с разной вычислительной нагрузкой, да и частоту можно менять. Так же есть контроль, что обработчик прерывания успел посчитать и выдать все, что требовалось, иначе тут же аварийная остановка.
  19. Да это подходит. Тот таймер, что формирует irq0 уже весь занят. Но это и не проблема, других таймеров с тремя CCR достаточно, вполне устраивает вариант запуска второго таймера в любой момент в свободном окне, после извлечения принятых данных. Сложно вписать это в свой HAL, чтобы верхний уровень видел одну простую функцию spi_transfer, и не знал ничего про DMA и таймеры. Пока вижу проблему, что не всегда на NSS пине есть выходы какого либо таймера. На интересующей меня плате именно так.
  20. Есть такая известная проблема у STM32 (в частности F4 и F7), что не умеет модуль SPI работать с NSS сигналом. Мне нужно опрашивать AS5047 по SPI, для этого надо два раза отправить фрейм длиной 16 бит с паузой и поднятием уровня на NSS. В системе есть приоритетное прерывание, которое срабатывает с частотой 20-30 кГц а его обработка может длиться до 30 мкс. Поэтому, переключать NSS через GPIO по таймеру плохой вариант. Нужно один раз за период настраивать передачу по SPI и забирать предыдущие данные а пока идёт работа в приоритетном прерывании пусть SPI как-то работает независимо. DMA я бы задействовал, это понятно, но, что делать с NSS? Настраивать таймер на выдачу ШИМ подходящей формы, но как его гарантированно синхронно запустить вместе с SPI? |=========================================-------|--------------- | | | irq0 irq0_end irq0 ... SPI_frame1 -- SPI_frame2 -----------| SPI poll Спасибо.
  21. Можно ничего не делать тогда, возврат управления в задачу уже означает, что приоритетное прерывание завершилось. Видимо много прерываний если там FSM, а между ними продолжает работать RTOS, в итоге нужно сообщить результат в задачу, понял.
  22. Следует задуматься, а для чего нужно то прерывание, приоритет которого выше RTOS, если по итогу это событие обрабатывается в задаче RTOS. То есть, все равно так или иначе будем ждать, пока RTOS завершит все критические дела и будет готова переключить контекст на задачу обработки. Тот же результат был бы достигнут если исходное прерывание имело приоритет пониже и работало в рамках правил RTOS, то есть запрещалось бы в критических секциях.
  23. Сделать еще одно программное прерывание в котором уже вызывать FromISR функции это правильное и быстрое решение. Если RTOS находится в критической секции в момент выполнения приоритетного прерывания, то программное прерывание поставится в очередь до выхода из критической секции.
  24. В своем коде не более одного уровня подкаталогов. Компилятору передаю "-I." чтобы отмерял все пути от корня проекта, и не нужно было по разному подключать один и тот же заголовок из разных мест. Бывают исключения когда встроен какой-то сторонний код, путь получается длиннее, но за счет include path не сокращаю. Могу исправить этот сторонний код если совсем плохо вписывается. Например freertos у меня это одна плоская директория с файлами, оригинальную структуру я не сохранял, и еще поправил заголовки, так, чтобы подключать в своем коде только один а в нем уже включены все queue.h и остальное.
×
×
  • Создать...