Оптимизация C++ локальной переменной, используемой для DMA ⇐ C++
-
Anonymous
Оптимизация C++ локальной переменной, используемой для DMA
У меня есть ошибка во встроенном приложении, и я не знаю, как ее лучше устранить. У меня есть локальная переменная, адрес которой я использую как указатель для передачи 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.
У меня есть ошибка во встроенном приложении, и я не знаю, как ее лучше устранить. У меня есть локальная переменная, адрес которой я использую как указатель для передачи 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.
Мобильная версия