Jump to content

    

ViKo

Модераторы
  • Content Count

    9951
  • Joined

  • Last visited

Community Reputation

0 Обычный

1 Follower

About ViKo

  • Rank
    Универсальный солдатик
  • Birthday 08/20/1963

Контакты

  • Сайт
    http://
  • ICQ
    0

Информация

  • Город
    : Минск

Recent Profile Visitors

20579 profile views
  1. А где эту AoE целиком скачать? Это какое-то новое издание той самой "Искусство схемотехники"?
  2. Вот такого Франкенштейна могу сотворить, присобачить к вызову функции из шаблона класса. #define BITBAND(Periph, Reg, Bit) \ BitBand<Periph##_BASE, offsetof(Periph##_TypeDef, Reg), Bit>
  3. Пока упражнялся, понял окончательно. Для переменных в ОЗУ, практически, бесполезно. Ибо адрес нужно вычислять в рантайме. Если не задавать принудительно для компиляции. А это ничуть не быстрее, чем чтение-модификация-запись целого слова. Вот для периферийных регистров битами управлять годится. Но это не частые процедуры. В общем, переделывая наработанное с С на С++, сделал шаблон. А буду ли применять, вопрос. Адрес регистра хотел выудить. Выудить-то удалось, а применить в шаблоне - нет. Заменил сложением адреса структуры и смещения регистра в структуре.
  4. /*!***************************************************************************** @brief BitBand class: read, reset, set bit @note only for Peripherals control @note usage: BitBand<RCC_BASE, offsetof(RCC_TypeDef, CR), RCC_CR_HSEON>::setBit(); */ template <const auto Base, const auto Offs, const auto Bit> class BitBand { private: static_assert((Base & 0xFFF0'0000) == PERIPH_BASE, // Check bit-band region "Address isn't in Bit-band region"); static constexpr auto Reg = Base + Offs; // Register address static constexpr auto calcPos(uint bitm) { // Bit mask position auto pos = 0; while (bitm >>= 1) ++pos; return pos; } static constexpr uint *calcAddr() { // Calculate alias address auto alias_addr = (Reg & 0xF000'0000) + 0x0200'0000 + ((Reg & 0x000F'FFFF) << 5) + (calcPos(Bit) << 2); return (uint *)alias_addr; } public: static auto readBit() { return *calcAddr(); } // read bit static void resetBit() { *calcAddr() = 0; } // reset bit static void setBit() { *calcAddr() = 1; } // set bit };
  5. Ясно. А передать в шаблон RCC_TypeDef и CR тоже не получится, чтобы вычислять смещение в самом шаблоне? Ничего, кроме показанного, не выходит. Выглядит страшно. BitBand<(RCC_BASE + offsetof(RCC_TypeDef, CR)), RCC_CR_HSEON>::setBit(); Слегка поправил. BitBand<RCC_BASE, offsetof(RCC_TypeDef, CR), RCC_CR_HSEON>::setBit();
  6. Так получается. Но не помогает. Шаблону требуются constexpr параметры, а этот ADR он не считает таковым. Попробовал было в шаблоне тип задать, а не значение. RCC->CR. Тоже не берёт.
  7. Таки вы дождётесь! https://habr.com/ru/company/yandex/blog/488588/
  8. Вожусь с bit-band шаблоном для STM32. Чтобы преобразовать bit-band адрес в alias адрес нужно неким образом превратить, например, RCC->CR в число 0x4002'3800, а потом уже добавлять к нему, что надо. Но как взять адрес по указателю на член структуры? Так не получается: const uint32_t ADR = &(RCC->CR); Можно так: constexpr uint ADR = RCC_BASE + offsetof(RCC_TypeDef, CR); Но очень уж много букв. Иначе - никак?
  9. Keil logic analyzer. "cannot add"

    Даю. У меня когда-то работало. apnt_230_v2.0.pdf
  10. Спад, он же только после частоты среза такой. Получается, нужно сделать фильтр, в котором с самого начала звукового диапазона уже спад. Ну, там, герц со 100.
  11. Так, не спасёт. Если .h нужен в нескольких .c, и в нём определена inline функция, она же, получается, будет неоднократно определена. Или, всё-таки, содержимое .h файла будет использоваться однократно не только в каждом файле, но и во всех? Не важно, много потоков "параллельно" или "последовательно". Суть не меняется, если каждая единица трансляции ничего не знает о соседней/следующей.
  12. Вы просто не хотите придумывать. Вот почитаете, какими программами кто пользуется, сразу за новым смартфоном побежите. Море!
  13. Если в .h файле определена inline функция, как спасёт препроцессор (работающий автономно для каждой единицы трансляции) от многократного определения функции?
  14. Вы так говорили? Вот как вы говорили. То есть, вы по прежнему считаете, что #pragma once защищает от неоднократного включения в один файл? Ладно... в единицу компиляции. А когда разруливаются многократные определения? При сборке?
  15. https://ru.wikipedia.org/wiki/Pragma_once https://docs.microsoft.com/en-us/cpp/preprocessor/once?view=vs-2019