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

Как в Си считать регистр процессора "в никуда"?

2 hours ago, vov4ick said:

Ещё можно попробовать

if (RCREG4);

 

Чем больше "думающий" компилятор, тем меньше шансов его обмануть!
Потом врубили оптимизацию какую нибудь, или апгрейдили среду, и начинаются вопросы - работало же, чего ж теперь эти хрычи из майкрочипа напортачили? И будете искать косяк в компиляторе, вместо того, чтоб искать двусмысленности в коде.

extern volatile __saddr char TRASH - и там и всё сиё грузить, чтоб без вариантов и на верняка.
Ну как умные люди тут уже посоветовали.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 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 сделан).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Жуть какая! 🙂

Интересно, с 2010 года хоть какие-то из компиляторов, которые отбрасывают чтение volatile-переменной поменяли своё мнение?

(Подозреваю, что IAR поменял, он же теперь вроде бы на LLVM сделан).

IAR вроде так и остался при своем. Т.е. генерит варнинг и пустой код.

На LLVM сделан Keil, вернее его ARM Compiler 6 основан на LLVM, а от нативного ARMCC они отказались года 4-5 назад))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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;

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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