-
Постов
1 239 -
Зарегистрирован
-
Посещение
-
Победитель дней
9
Сообщения, опубликованные VladislavS
-
-
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);
-
57 минут назад, Arlleex сказал:
полагаю, максимум C++98, судя по году релиза бинарников
-std=c++98
Впрочем, то что не собирается лучше исправить. Потому что на моей памяти из языка выпиливали только реальные эпик фэйлы.
57 минут назад, Arlleex сказал:пытался от volatile избавиться
С оптимизирующим компилятором в C/C++ это в принципе невозможно. Скорее это неправда.
57 минут назад, Arlleex сказал:ведь в C++23 предупреждение исчезло
А говорите от эмбеддеров отвернулись :)))
57 минут назад, Arlleex сказал:Это в GCC или где?
Это в GCC. Естественно с оптимизацией. У меня код без оптимизации не бывает в принципе. Метапрограммирование.
57 минут назад, Arlleex сказал:то это memcpy не тупой а хитрый
Какой бы хитрый он не был, это вызов библиотечной функции вместо тупого цикла на месте.
-
23 минуты назад, Arlleex сказал:
Ну и опять же, плюсы развиваются куда стремительнее по отношению к Си
К сожалению, недостаточно быстро. Сами новшества по капле раз в три года, а компиляторы потом ещё догоняют годами.
23 минуты назад, Arlleex сказал:а самое главное, не всегда совместимо между версиями
А вот это как раз неправда. Стремление к максимальной совместимости со старым кодом (для нас это конечно хорошо) является чуть ли не основным тормозом развития языка.
23 минуты назад, Arlleex сказал:слишком много вариантов описания одного и того же
Ничего удивительного, ведь у нас язык высокого уровня и мы пишем не инструкции процессора, а алгоритмы работы с данными. Более того, только с volatile данными! Алгоритмы можно по разному написать, это норм.
23 минуты назад, Arlleex сказал:постепенно забивает на ембеддед
Я бы не сказал. В языке всё больше компайлтайм вычислений. Всё больше контейнеров в стандартной библиотеки оптимизируют для работы без динамической памяти. Всё это только приближает к использованию в эмбедде.
23 минуты назад, Arlleex сказал:например, я о составных присваиваниях |= над volatile переменными в C++20
Это попытка убрать зависимые от компилятора реализации. Да, немного неудобно на старом коде в эмбедде, но мешает не сильно. Можно как переписать, так и подавить предупреждение. Понимание зачем это нужно есть.
23 минуты назад, Arlleex сказал:Справедливости ради, NULL не обязательно должен иметь бинарное значение 0
По хорошему, он вообще не должен иметь значения отображающегося на адресацию памяти. Как определить, вернулся NULL или это реальная память по адресу 0?
21 минуту назад, Arlleex сказал:А Вы ожидали другого? Чего?
Я ожидал компактного и оптимизированного цикла копирования 32-битными словами. Код с memcpy и memset получается больше и медленнее. Уж поверьте, проверено.
Неочевидное добавление вот сюда volatile делает код меньше и быстрее.
for(volatile uint32_t* pSrc = _sidata, *pDst = _sdata; pDst != _edata; *pDst++ = *pSrc++);
21 минуту назад, Arlleex сказал:каждые три года надо было только нововведения проработать
Именно так. Сидишь и как дурак ждешь три года эти нововведения чтобы применять можно было, когда хочется уже сейчас :)))
GD32F103RBT6. Пропуск прерываний в режиме захвата
в TI, Allwinner, GigaDevice, Nordic, Espressif и другие
Опубликовано · Пожаловаться
Искать надо там где потерял, а не там где лучше видно. Вроде это очевидно.