girts 7 16 марта Опубликовано 16 марта · Жалоба 2 hours ago, vov4ick said: Ещё можно попробовать if (RCREG4); Чем больше "думающий" компилятор, тем меньше шансов его обмануть! Потом врубили оптимизацию какую нибудь, или апгрейдили среду, и начинаются вопросы - работало же, чего ж теперь эти хрычи из майкрочипа напортачили? И будете искать косяк в компиляторе, вместо того, чтоб искать двусмысленности в коде. extern volatile __saddr char TRASH - и там и всё сиё грузить, чтоб без вариантов и на верняка. Ну как умные люди тут уже посоветовали. 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 17 марта Опубликовано 17 марта · Жалоба В 16.03.2024 в 18:03, Arlleex сказал: А еще ссылка по теме, кому интересно: https://embeddedgurus.com/stack-overflow/2010/03/reading-a-register-for-its-side-effects-in-c-and-c/. Тут подверждается, что даже "правильная" для конкретного языка C/C++ конструкция - не гарантия. Жуть какая! 🙂 Интересно, с 2010 года хоть какие-то из компиляторов, которые отбрасывают чтение volatile-переменной поменяли своё мнение? (Подозреваю, что IAR поменял, он же теперь вроде бы на LLVM сделан). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 17 марта Опубликовано 17 марта · Жалоба 1 час назад, AHTOXA сказал: Жуть какая! 🙂 Интересно, с 2010 года хоть какие-то из компиляторов, которые отбрасывают чтение volatile-переменной поменяли своё мнение? (Подозреваю, что IAR поменял, он же теперь вроде бы на LLVM сделан). IAR вроде так и остался при своем. Т.е. генерит варнинг и пустой код. На LLVM сделан Keil, вернее его ARM Compiler 6 основан на LLVM, а от нативного ARMCC они отказались года 4-5 назад)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 17 марта Опубликовано 17 марта · Жалоба 56 минут назад, Arlleex сказал: IAR вроде так и остался при своем. Т.е. генерит варнинг и пустой код. Я судил по изменениям в inline-ассемблере IAR-а. Сейчас он выглядит вот так: __attribute__((__always_inline__)) inline void set_interrupt_state(status_reg_t status) { asm volatile ( "MSR PRIMASK, %0\n" : : "r"(status) :"memory" ); } Ну то есть один-в-один gcc. Этож-ж-ж неспроста? 🙂 Короче, мысль моя вот в чём: в 90% случаев должно хватить простого reg; или, для большей понятности (void)reg; Но на всякий случай лучше проверить дизассемблер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться