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

VladislavS

Свой
  • Постов

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

  • Посещение

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

    9

Сообщения, опубликованные VladislavS


  1.  

    17 минут назад, LAS9891 сказал:

    Как я ИХ мог очистить

    Между чтение для обработки и повторным чтением для очистки могло произойти что угодно.

    3 часа назад, LAS9891 сказал:

    Вам стоило написать в STM и рассказать им какие они там все говнокодеры

    Это Секрет Полишинеля. Впрочем, тот код что для них индусы пишут, ещё ничего. :)))

  2. 1 час назад, LAS9891 сказал:
    TIMER_INTF(TIMER1) &= (~TIMER_INTF_CH0IF);

    А потом у вас прерывания теряются. Тут вы очистили флаги, которые "вскочили" во время обработки текущего прерывания, не обработав.

    45 минут назад, LAS9891 сказал:

    Тут пишут, что флаг надо смотреть не прямо в регистре, а через переменную:

    Смотреть прямо в регистре периферии микроконтроллер не может. Он сначала считывает в регистр процессора, а затем смотрит. Локальная переменная будет расположена в регистре процессора. Не нужно много раз читать регистр статуса в регистр процессора, это напрасная трата времени в прерывании.

  3. 56 минут назад, RR2021 сказал:

    Пока что делаю так  сначала умножил на 10 , перевёл в int, потом прибавил 1 перевёл во float, и разделил на 10 

    Мои глаза!!! 

    Что это изменит? Значение 1.1 во float не представимо точно.

    image.png.ca63230473357b6b41c8fe94908ef67e.png

     

  4. 1 час назад, razrab83 сказал:

    которая инитится в main

    У меня для совместимости с разными компиляторами (тулчейнами) вот такая конструкция используется

    #ifdef __cplusplus
    extern "C" {
    #endif
    
    #ifdef __ICCARM__
      int __low_level_init(void)
    #else
      void SystemInit()
    #endif
    {
    
      // Код инициализации железа
    
    #ifdef __ICCARM__
      return 1;
    #endif
    }
    
    #ifdef __cplusplus
    }
    #endif

     

    35 минут назад, EdgeAligned сказал:

    Во внешней SDRAM хранить одиночные переменные или малые объемы данных - неэффективно.

    А с чего вы взяли что там одиночная переменная? Ясно же, что пример тестовый, что там реально в куче ХЗ.

  5. 22 минуты назад, amaora сказал:

    А кто-нибудь здесь пишет

    Не знаю это ли вы имеете в виду. Вот у меня в одной из библиотек обработчик прерываний USB. В нём IRQHandlers это список типов. Для каждого элемента списка выполняется лямбда.image.thumb.png.e87d0779ee24b07eb56ae9eaa5099ef5.png

    А сам список зависит от реализуемого класса. Например, для CDC обработчики двух конечных точек.

    image.thumb.png.c6fd84ce0b4a5c27c4325cf08500ff71.png

     

     

     

    3 минуты назад, Arlleex сказал:

    Опять же - это ведь не переменная, а константа.

    Вообще-то переменная. Изменять нельзя, правда. :)))

    4 минуты назад, Arlleex сказал:

    Видимость ограничена блоком (функцией), время жизни - глобальное, супер.

    Это и в православном С так было со статическими локальными переменными.

  6. 1 час назад, Arlleex сказал:

    Насчет предикатов, функторов, лямбд: насколько я понял, их ценность кроется, в основном, при работе со стандартной библиотекой.

    И при написании своих библиотек. В рядовом коде они, действительно, выглядят не очень уместно. Но когда с ними на ты, то так и подмывает применить.

    1 час назад, Arlleex сказал:

    почему следующая строчка не вычисляется в compile-time?

    В смысле?

    auto constexpr X = 100;
    auto Y = 100;
    
    auto func() 
    {
      int constexpr i = X<<2;  // Компайлтайм, Ok
      int constexpr I = Y<<2;  // Рантайм, ошибка
    }

     

    1 час назад, Arlleex сказал:

    Стоит добавить static перед объявлением, как выражение полностью становится compile-time.

    Ни в коем случае, это сделает локальную переменную фактически глобальной для данной функции, но она всё так же должна быть инициализирована вычисленным на этапе компиляции значением.

    1 час назад, Arlleex сказал:

    не помню как насчет -O0

    и это не зависит от оптимизации. При любой оптимизации должно быть вычислено на этапе компиляции.

    1 час назад, Arlleex сказал:

    Единственное, какого-то вменяемого полного описания constexpr-выражений и функций, constexpr if() найти не просто

    Да вроде всё просто:

    1. constexpr переменные (читай константы). Они всегда должны быть инициализированы значением вычисленным на этапе компиляции.

    2. constexpr функции. Они могут работать как в компайлтайме, так и в рантайме. В первом случае (когда все условия сложились) их значения можно использовать там где подразумевается константа этапа компиляции: параметры шаблонов, инициализация constexpr переменных, if constexpr()... Если значение нельзя в компайлтайме вычислить, то работает как обычная функция в рантайме. В С++20 появилось более жёсткое consteval, которое не пускает функцию в рантайм.

    3. if constexpr() Тут всё просто. Выражение "под условием" должно быть вычислено на этапе компиляции. 

    • Upvote 1
  7. Про специализацию шаблонов. Появившийся в С++17 if constexpr превратил специализацию функций и методов в привычное функциональное программирование, которое даже не воспринимается как специализация. В С++20 появились концепты, которые позволяют гибко специализировать классы. SFINAE ушёл в прошлое. Достаточно просто слезть с броневичка и пользоваться имеющимся инструментом.

  8. 27 минут назад, EdgeAligned сказал:

    никакого волшебства

    Не понимаю почему знание шаблона стандартной библиотеки воспринимается как чудо. 

    31 минуту назад, EdgeAligned сказал:

    ВСЕГО ЛИШЬ

    Пользуйтесь, на здоровье. Сокращает писанину.

  9. 3 часа назад, EdgeAligned сказал:

    А что есть в вашем понимании "ясное и понятное"?

    Специализация if constexpr абсолютно однозначна и понятна. Желание специализировать методы иным способом вызывает, как минимум, недоумение. 

    3 часа назад, EdgeAligned сказал:

    std::size() - это всего лишь стандартный шаблон, появившийся в ++17. Это не свойство самого языка,

    Что-что? Стандартная библиотека это неотъемлемая часть языка.

    3 часа назад, EdgeAligned сказал:

    То есть, в целом, вы согласны

    Не надо за меня писать. Что я считаю и с чем согласен напишу сам. Спасибо.

    3 часа назад, artemkad сказал:

    А как по мне как раз тут возможно разночтение.

    Невозможно. Метод size() используется в разных контейнерах стандартной библиотеке и везде значит одно и то же.

    4 часа назад, EdgeAligned сказал:
    std::is_same<T2, int>::value

    std::is_same_v<T2, int>

  10. 52 минуты назад, EdgeAligned сказал:

    Если честно, жесть

    Вы всё вывернули наизнанку. Вместо специализаций, которые непонятно как сработают, ясное и понятное программирование. Это как раз шаг вперёд к понятности и надёжности кода.

  11. template<typename T1, int N>
    struct A 
    {
      void Foo()
      { 
        if constexpr(N==0) {} else {}  
      }	
    };

     

    7 часов назад, artemkad сказал:

    Че непонятно в "размер buf деленный на размер его нулевого элемента"? Это классика для начинающих.

    То ли дело в непонятном С++ это будет std::size(buf);

×
×
  • Создать...