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

AHTOXA

Свой
  • Постов

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

  • Посещение

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

    3

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


  1. А, там ещё счётчик имеется. Даже два. Ну тогда нормально, только непонятно, для чего вобще этот статус bsy нужен :)
  2. Это вопрос? Если вопрос, то ответ: нет, не может. (Если не вопрос, то всё равно не может :-))) __root и volatile - это совсем разные вещи. volatile не для добавления переменной в ref (что бы это ни было)
  3. Выглядит так, что достаточно объявить volatile член структуры sI2CSOp.sop. Но вообще как-то сложно всё это выглядит. Если это для ОСРВ, то можно использовать какой-нибудь Event для ожидания окончания чтения. Ну и на всякий случай: u32 fram_Read(u16 addr, u16 len, u8 buf[], volatile sI2CSOp *sop) { sI2CTSlot *slot; if(!(rets = i2c_TakeTransSlot(&slot))) { ... slot->bsy = I2C_TSLOT_BUSY; Разве здесь нет гонки? По идее slot->bsy должен устанавливаться где-то внутри i2c_TakeTransSlot(), в критической секции. Иначе два потока могут захватить один и тот же слот. (Или это кооперативная ось, и функция i2c_TakeTransSlot() не вызывается из прерываний?)
  4. Просто куда-нибудь мимо окошка со смайликами ткните, они закроются.
  5. Добавлю, что в случае флага варианты типа while (flag) {...}; и bool getFlag() { return globalFlag; } while (getFlag()) {...}; одинаковы - и там и там без volatile можно пролететь.
  6. Да, просто volatile здесь не поможет. Здесь нужен atomic (который обычно подразумевает volatile + атомарность изменений). volatile - это для регистров периферии.
  7. А какая разница, как происходит обращение - через функцию или без? Скажем, компилятор в начале функции прочитает переменную в регистр, и будет работать с ним. А в середине функции - бац, прерывание, вызов функции, записали новое значение. Потом возврат, и функция записывает значение из регистра. И мы потеряли изменения, сделанные в прерывании.
  8. Похоже, у вас подключился библиотечный стартап. Добавьте к ключам линкера ключик -nostartfiles. Также полезно дать компилятору ключики -fno-exceptions -fno-rtti, чтобы не тянулись такие тяжёлые штуки. Эти ключи не всегда помогают, но лишними не будут.
  9. О, так вообще прекрасно. Раньше было "А" ответил "Б", и это немного сбивало с толку. А сейчас "А" ответил в тему пользователя "Б" - это гораздо лучше. Кстати, пока не было компактного режима, я успел привыкнуть к подробному, и теперь он мне нравится больше :D
  10. А, понял. То есть смысла собственно в структуре нет, можно слепить все символы просто в массив?
  11. STM32+FPU

    Использовать константы одинарной точности. Указывая суффикс f или ключ компилятора -fsingle-precision-constant (это для gcc). Я об этом уже писал (и не только я). Использовать математические функции, работающие с параметрами одинарной точности (sinf(), например). Потому что по умолчанию константы с плавающей точкой считаются double. Я об этом уже писал (и не только я). А если в выражении хоть один операнд является double, то все другие операнды преобразуются в double, и вычисления производятся в double. Так работает си.
  12. А какой смысл в такой структуре? Как выбирать нужный член по коду символа? Куча if-ов? Зачем тогда объединять все эти массивчики в структуры?
  13. STM32+FPU

    В стандартной math.h свои функции, в arm_math.h - свои. Разные. В этом конкретном случае одинаково. А вот если будет типа так: float angle = 13.45; float s = sin(3.1415*angle); , то во второй строчке число 3.1415 будет double. Поэтому при вычислении во второй строчке сначала будет выполнено преобразование angle в double, потом умножение двух double, потом вычисление синуса в double, а потом результат преобразован во float. И сопроцессор будет почти не при делах.
  14. Ну так и я об этом. Разговор шёл о том, зачем нужна прослойка между линукс-платой и драйверами шаговиков в 3D-принтере.
  15. Ну во-первых, периферии там всё же сильно поменьше, чем в микроконтроллерах. Во-вторых, они гораздо нежнее. И помех боятся больше. Ну и жёсткое реальное время в линуксе обеспечить - очень сложная задача. Даже если вы используете аппаратный таймер, какой-нибудь другой программный модуль может подвесить всё там. В общем, я не слышал, что так делают. Если у вас есть примеры управления устройствами, требующими жёсткого realtime, из линукса - буду благодарен за примеры/ссылки. (Но не такие, как привёл x893 ).
  16. Ну, уж здесь-то я такого увидеть никак не ожидал. Понятно же, что верхний уровень - компьютеры с линуксом, а нижний - микроконтроллеры/FPGA. Или вы всерьёз думаете, что вектором тяги двигателя рулит линукс напрямую?
  17. Малинка управляет космическими кораблями? Напрямую? Ой сомневаюсь. Вы вот не DIY-шник. Сможете обеспечить частоту управления шаговиками 120КГц при помощи GPIO без джиттера? Это легко делает ардуина. А 32-битный контроллер обеспечивает уже 337 КГц. Ну не предназначен линукс для такого ногодрыга.
  18. Управлять-то можно, но получится плохо. Потому что нужно чётко выдерживать тайминги шагов. Поэтому ставят между линуксом и 3D-принтером платку с микроконтроллером. Вот пример: Klipper. Вариантов прямого управления 3D-принтерами с линукса я не знаю.
  19. Для реалтайма, вестимо. Скажем, качественно управлять шаговиками 3D-принтрера.
  20. Я тоже не использую, потому что без динамического распределения памяти std::string всё равно не будет работать. Но оптимизация такая имеется. Можно использовать std::array в качестве замены обычному массиву - накладных расходов минимум.
  21. Да, бывает такое. Называется SSO (small string optimization). Размер зависит от разрядности архитектуры и реализации стандартной библиотеки. Вот здесь немножко разбирается, как оно устроено.
  22. Не обижайте Мейерса, он хороший. Если какой-то человек говорит фигню, и ссылается при этом на Мейерса, это не значит, что Мейерс тоже говорит фигню. Просто толкователь такой :-) А уж Мейерс, будьте уверены, очень хорошо знает, во что компилируется та или иная конструкция в плюсах.
  23. STM32+FPU

    Взвести нужные битики в регистре SCB->CPACR (@RadiatoR написал выше). Нужно стараться, чтобы все переменные были float а не double. По умолчанию компилятор делает double, и в этом случае сопроцессор особо не помогает. В прерываниях плавучку не использовать (либо озаботиться сохранением плавучего контекста). Работает конечно. Да. Либо указать ключ -fsingle-precision-constant (это для gcc). Тогда все константы по умолчанию будут float, а не double.
×
×
  • Создать...