Jump to content

    

ViKo

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

    9682
  • Joined

  • Last visited

Everything posted by ViKo


  1. Посмотреть бы осциллограмму потребления, падение напряжения на малом резисторе. Вдруг всё не так, как намеряно стрелочным амперметром?
  2. Нашёл ошибку. Слово "class" в определении функции было лишним. Сколько, однако, мелочей нужно контролировать. Продолжу дальше в Кейле для класса порта.
  3. Вот, для обучения пробую создать такой шаблонный класс. Но не могу даже правильно написать. Помогите, где какую скобку и имя вставить. #include <stdint.h> #include <assert.h> constexpr char S1 = 'A'; constexpr char S2 = 'B'; constexpr char S3 = 'C'; template <char First, char ... Other> class Pack { public: template <> static uint64_t comb(char First) { return First << 8; } template <> static uint64_t comb(char ...) { return (First << 8 | comb(Other ...)); } }; int main(void) { using P = Pack<S1,S2>; volatile uint64_t D = P::comb('D','E'); } Без конструктора оно легально? Мне, как бы, ни к чему. Мне только функции из него нужны. Но это вопрос другой.
  4. Вот показываю работающий вариант. #include <iostream> #include <cstdlib> #include <cstdint> #include <cstddef> struct Test_st { char Let; int Num; }; /*_____________________________________________________________________________*/ constexpr Test_st St1 = { 'A', 10 }; constexpr Test_st St2 = { 'B', 11 }; volatile int Temp1 {1}; template <const Test_st &S00, const Test_st &S01> class Test_cl { public: Test_cl() { Temp1 = S00.Let << 8 | S01.Let; } }; /*_____________________________________________________________________________*/ int32_t main(void) { std::cout << Temp1 << '\n'; Test_cl <St1, St2> Ti; std::cout << Temp1 << '\n'; }
  5. Не могу скомпилировать первый набросок. Где-то ошибся, но не пойму, где. Правильно ли я пытаюсь передать в шаблон ссылки на структуры constexpr? Обновил вопрос. Тестовый пример проверяю здесь: https://www.onlinegdb.com/fork/BJA5GHO3N Как передать в конструктор шаблона нетиповой параметр - ссылку? Если конструктор внутри определения класса, тогда компилируется нормально. Как только снаружи - затык. #include <iostream> #include <cstdlib> #include <cstdint> #include <cstddef> struct Test_st { char Let; int Num; }; /*_____________________________________________________________________________*/ constexpr Test_st St1 = { 'A', 10 }; constexpr Test_st St2 = { 'B', 11 }; volatile int Temp1 {1}; template <const Test_st &S00, const Test_st &S01> class Test_cl { public: Test_cl(); }; template <const Test_st &S00, const Test_st &S01> class Test_cl<S00, S01>::Test_cl() { { Temp1 = S00.Let << 8 | S01.Let; } } /*_____________________________________________________________________________*/ int32_t main(void) { std::cout << Temp1 << '\n'; Test_cl <St1, St2> Ti; std::cout << Temp1 << '\n'; }
  6. В этом случае - да. И то, не на 100% обязательно. Можно перекодировать команды и данные под имеющуюся шину. constexpr функцией, например, если не вручную. А если нужно управлять четырьмя выборами устройств, то и совсем не надо. Подать 0x0003 или 0x1080 - одинаково.
  7. Чтение-модификация-запись. Я не планирую переупаковывать биты порта GPIO под ширину "виртуальной шины". Главное - чтобы было можно управлять выбранным набором битов. И, да, я предпочитаю BSRR регистры. Записываю и стираю все биты порта одной командой.
  8. Маску для битов порта. Данные - это аргументы функций порта. Маска битов порта - по их номерам в структуре, описывающей пины порта.
  9. Если работа по маске не выполняется на этапе компиляции, тогда я вручную её создам.
  10. Так вы через bitband биты устанавливаете, по одному. Я, повторюсь, ради удобства использования не желаю терять оптимальность реализации.
  11. Ок, понял (пытаюсь). Читаю это: https://m.habr.com/ru/company/otus/blog/444524/ Тогда это нужно было назвать "лямбда-функтором".
  12. Это именно то, что я спрашивал. Будем смотреть, во что компилируется, а не сколько в нём этажей. Есть мысли сделать класс полного порта и наследственный класс на произвольное количество выводов. В результате должно компилироваться в команды, обращающиеся непосредственно к регистрам GPIO.
  13. Спасибо, Антон! Запись одной ножки пропустили. Вернее, запись есть, а в комментарии написано "чтение", а чтения нет. И я не вижу, как getMask для одного параметра работает. А, это в конце, нашёл. Ага, sizeof... использовали. Вот оно, решение вопроса по теме.
  14. И я укажу. Я свои типы знаю. Не могу передать эти параметры в шаблонные функции. Об этом и спрашивал в стартовом сообщении.
  15. Не-ти-по-вой параметр! http://ci-plus-plus-snachala.ru/?p=3989
  16. Так, да не так, DASM. Я хочу в шаблон класса передать не типы, а значения. Типы я и так знаю. Они не меняются. И вот прибыл в лингвистический тупик.
  17. Соглашусь, что разные. Функтор - это класс с перегруженным operator(), предназначенный для манипулирования объектами контейнера. Не соглашусь, что лямбда-функция - это функтор. Лямбда-выражения в C++ используются именно в виде анонимных функций, без имени, адреса, используемых в месте определения. Насчет порядка функций - это, видимо, из питона и т.п. термин. В учебниках по C/C++/C# не встречал. Да и какой может быть порядок, если вложенные функции невозможны. Кроме этих лямбд. Нисколько не сомневаюсь, что вы продвинутый программист и в теории и на практике. Однако, лямбда-функция означает лямбда в форме функции. Или наоборот. И уж точно не было корректным ваше безоговорочное "не функции вообще".
  18. Это не перевод, а мои дилетантские размышления. Предполагал использовать шаблон с переменным количеством аргументов. Но не подходит. Или вы спрашиваете о самом термине "variadic"? https://ru.m.wikipedia.org/wiki/Вариативный_шаблон Я насчет масок думал когда-то... Не хочу терять описания битов порта в виде структуры свойств (номер, тип, скорость, др.). А из них формировать маски для регистров порта, получается, нужно делать не в классе, а снаружи. Вручную. Отдельные пины - неэффективно. Вот если эти объекты да собрать в порт. Представляется сложным.
  19. Считаю, мне ничего не даст передача параметров из шаблона класса в шаблон функций этого класса. В вариативном шаблоне, допустим, передал я параметры. Но мне нужно использовать, например, только для двух пинов из шестнадцати, причем, не первых двух, а любых. То есть, нет никакого механизма выбора конкретных параметров из всего набора. Поэтому буду делать, как говорил - отдельный класс порта на все 16 ножек, и отдельные классы на 1, 2, 4, 8.
  20. Я так понимаю, по вариативным шаблонам у нас один Антон специалист? Остальные мастера в другом?
  21. В онлайн-вьюверах показывает? Скорее всего, CAM350, не видя границ, прекращает рисовать, как только все площадки соединяет. Не вижу повода для беспокойства. Нарисуйте контур plane по всей плате, получите залитым ограниченную область. Иначе - самой платой обрежется.
  22. Я посмотрел в P-CAD, и не вижу никаких контуров на внутренних слоях, но вижу, что площадки подключены к цепям. Сделал герберы, но границ не вижу. Видимо, и не должно быть. Но и прямоугольных участков тоже нет.
  23. На 7-73.pcb, что я скачал. P-CAD не показывает такой формы plane, как на картинке в CAM350. Герберы можно посмотреть здесь: https://gerber-viewer.ucamco.com/ http://www.gerber-viewer.com/
  24. Нет, я не проверяю Plane GND. И герберы не генерил, и не смотрел. Хотя, конечно, стоит взять за правило. На показанной плате не видно таких Plane, как на нижней картинке. Нет ли здесь вины (настроек) CAM350? Вы, точно, герберы смотрите?