Оптимизация C++ локальной переменной, используемой для DMAC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Оптимизация C++ локальной переменной, используемой для DMA

Сообщение Anonymous »


У меня есть ошибка во встроенном приложении, и я не знаю, как ее лучше устранить. У меня есть локальная переменная, адрес которой я использую как указатель для передачи DMA. Я это немного делаю в программе, но только недавно это вызвало сбой. Я думаю, это связано с тем, что оптимизация освобождает память для других целей после того, как адрес используется в программе, но до того, как произойдет передача dma. Пример:

struct { летучий uint32_t адрес_ptr; } ДМА; void spi_write(uint8_t *data) { DMA.address_ptr = reinterpret_cast(данные); } основной() { uint8_t data_out[2] = {0xAB, 0xCD}; spi_write (data_out); } В результате spi отправляются случайные числа. Я могу это исправить, превратив data_out в глобальную переменную. Поэтому я предполагаю, что компилятор C предполагает, что он может использовать память data_out для других целей после установки DMA.address_ptr. Я не могу придумать, как предотвратить это. Есть ли способ предотвратить такую ​​оптимизацию? Или есть еще какая-то ошибка?

Процессор представляет собой STM32 Cortex M4. Как в оптимизированном, так и в неоптимизированном случае адрес DMA указывает на доступную ему область памяти (блок 0x20000000). Проблема проявляется независимо от местоположения памяти: ссылка godbolt.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»