-
Постов
1 241 -
Зарегистрирован
-
Посещение
-
Победитель дней
9
Сообщения, опубликованные VladislavS
-
-
1 час назад, LAS9891 сказал:
TIMER_INTF(TIMER1) &= (~TIMER_INTF_CH0IF);
А потом у вас прерывания теряются. Тут вы очистили флаги, которые "вскочили" во время обработки текущего прерывания, не обработав.
45 минут назад, LAS9891 сказал:Тут пишут, что флаг надо смотреть не прямо в регистре, а через переменную:
Смотреть прямо в регистре периферии микроконтроллер не может. Он сначала считывает в регистр процессора, а затем смотрит. Локальная переменная будет расположена в регистре процессора. Не нужно много раз читать регистр статуса в регистр процессора, это напрасная трата времени в прерывании.
-
Искать надо там где потерял, а не там где лучше видно. Вроде это очевидно.
-
2 часа назад, dimka76 сказал:
А можно ссылочку на тему (топик) ?
Да там много, на первых страницах разделела ARM, RISC-V читать.
-
Теоретически да. Несколько тактов "под угрозой". Безопаснее будет
TIMER_INTF(TIMER1) = ~i;
- 1
-
А я бы вообще вот так сделал
u32 i = TIMER_INTF(TIMER1); TIMER_INTF(TIMER1) = 0; if (i & TIMER_INTF_CH0IF) { ... } if (i & TIMER_INTF_CH1IF) { ... }
-
Никак оно не будет работать. Сто раз уже писали - нужен DDS - возьми DDS и не сношай людям мозги.
-
47 минут назад, alag57 сказал:
C/C++ Compiler->Output->Generate debug information
Это совсем про другое. В исполняемый файл добавляется исходный код.
Browse information в настройках среды включается.
-
После макросов min и max деже читать этот ахтунг неохота.
-
1 час назад, RR2021 сказал:
нет не имеет , у меня gd32f103rc
Изменено 47 минут назадЧто-то мне подсказывает, что переход в double будет дешевле делений/умножений/приведений.
-
Какая разница, будет у вас там 2e-8 или 1e-3 ошибка, если вы на всё что меньше 0.1 в итоге чихаете?
PS: Как писали раньше, принимаем младший разряд int за 0.1 и работаем в целых числах.
-
56 минут назад, RR2021 сказал:
Пока что делаю так сначала умножил на 10 , перевёл в int, потом прибавил 1 перевёл во float, и разделил на 10
Мои глаза!!!
Что это изменит? Значение 1.1 во float не представимо точно.
-
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 хранить одиночные переменные или малые объемы данных - неэффективно.
А с чего вы взяли что там одиночная переменная? Ясно же, что пример тестовый, что там реально в куче ХЗ.
-
-
Это только японские бракоделы свои машины постоянно отзывают. ВАЗ себе такого не позволяет. -
41 минуту назад, RDutch сказал:
Мне надо увеличить точность, хотя бы незначительно.
Чувствуется инженерный подход :))) Незначительно! Результат ничто - процесс всё!
-
22 минуты назад, amaora сказал:
А кто-нибудь здесь пишет
Не знаю это ли вы имеете в виду. Вот у меня в одной из библиотек обработчик прерываний USB. В нём IRQHandlers это список типов. Для каждого элемента списка выполняется лямбда.
А сам список зависит от реализуемого класса. Например, для CDC обработчики двух конечных точек.
3 минуты назад, Arlleex сказал:Опять же - это ведь не переменная, а константа.
Вообще-то переменная. Изменять нельзя, правда. :)))
4 минуты назад, Arlleex сказал:Видимость ограничена блоком (функцией), время жизни - глобальное, супер.
Это и в православном С так было со статическими локальными переменными.
-
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() Тут всё просто. Выражение "под условием" должно быть вычислено на этапе компиляции.
- 1
-
Вы поняли что хочет ТС? Я ничегошеньки, потому и хотелось бы код посмотреть, может там намёки есть. Хотя, если код такой же как русский в сообщении, то шансы малы.
-
Может хоть одну строчку кода покажете?
-
Про специализацию шаблонов. Появившийся в С++17 if constexpr превратил специализацию функций и методов в привычное функциональное программирование, которое даже не воспринимается как специализация. В С++20 появились концепты, которые позволяют гибко специализировать классы. SFINAE ушёл в прошлое. Достаточно просто слезть с броневичка и пользоваться имеющимся инструментом.
-
27 минут назад, EdgeAligned сказал:
никакого волшебства
Не понимаю почему знание шаблона стандартной библиотеки воспринимается как чудо.
31 минуту назад, EdgeAligned сказал:ВСЕГО ЛИШЬ
Пользуйтесь, на здоровье. Сокращает писанину.
-
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>
-
52 минуты назад, EdgeAligned сказал:
Если честно, жесть
Вы всё вывернули наизнанку. Вместо специализаций, которые непонятно как сработают, ясное и понятное программирование. Это как раз шаг вперёд к понятности и надёжности кода.
-
template<typename T1, int N> struct A { void Foo() { if constexpr(N==0) {} else {} } };
7 часов назад, artemkad сказал:Че непонятно в "размер buf деленный на размер его нулевого элемента"? Это классика для начинающих.
То ли дело в непонятном С++ это будет std::size(buf);
GD32F103RBT6. Пропуск прерываний в режиме захвата
в TI, Allwinner, GigaDevice, Nordic, Espressif и другие
Опубликовано · Пожаловаться
Между чтение для обработки и повторным чтением для очистки могло произойти что угодно.
Это Секрет Полишинеля. Впрочем, тот код что для них индусы пишут, ещё ничего. :)))