У меня есть код, который работал хорошо при составлении с GCC, но не работает правильно при составлении с Clang. Я отслеживал проблему до чтения нестабильной памяти (на микроконтроллере). Я обнаружил, что вступил в сборку, что память, связанная с PMA_ADDRESS , читается в регистр, но значения, установленные в регистре, никогда не используются. Таким образом, harder_setup_packet никогда не называется предположительно, потому что оптимизатор определил, что буфер никогда не изменится. Сделав Buffer_out в изменчивую uint8_t*, код работает правильно. Но я не понимаю, почему в этом случае это должно быть нестабильным. Я бы подумал, что одного волатильного будет достаточно, чтобы убедить компилятора, что буфер стоит посмотреть. Мне интересно, какова моя логическая ошибка в следующем коде: < /p>
void read_pma(uint8_t byte_count, volatile uint16_t * pma_address, uint8_t *buffer_out) {
int count_received_16 = (byte_count + 1) >> 1;
for(int i=0; ibuffer[0].EP_RX, buffer);
handle_setup_packet(reinterpret_cast(buffer));
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... ile-memory
Сложность чтения нестабильной памяти ⇐ C++
Программы на C++. Форум разработчиков
1759369576
Anonymous
У меня есть код, который работал хорошо при составлении с GCC, но не работает правильно при составлении с Clang. Я отслеживал проблему до чтения нестабильной памяти (на микроконтроллере). Я обнаружил, что вступил в сборку, что память, связанная с PMA_ADDRESS [i] , читается в регистр, но значения, установленные в регистре, никогда не используются. Таким образом, harder_setup_packet никогда не называется предположительно, потому что оптимизатор определил, что буфер никогда не изменится. Сделав Buffer_out в изменчивую uint8_t*, код работает правильно. Но я не понимаю, почему в этом случае это должно быть нестабильным. Я бы подумал, что одного волатильного будет достаточно, чтобы убедить компилятора, что буфер стоит посмотреть. Мне интересно, какова моя логическая ошибка в следующем коде: < /p>
void read_pma(uint8_t byte_count, volatile uint16_t * pma_address, uint8_t *buffer_out) {
int count_received_16 = (byte_count + 1) >> 1;
for(int i=0; ibuffer[0].EP_RX, buffer);
handle_setup_packet(reinterpret_cast(buffer));
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79780552/difficulty-reading-volatile-memory[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия