НАШЁЛ
АХАХАХАХ
виноват -O3 !! если поставить -O1, то всё работает как должно
Я понял это, когда в отладчике стал смотреть инициализацию DMA по шагам. В сишном коде все операции записаны в том порядке, в котором они ДОЛЖНЫ быть - сначала устанавливаем регистры адресов, затем настраиваем транзакцию, затем включаем... а оптимизатор решил, что всё это хуйня и в итоге получилось так: сначала блок DMA включается на передачу, успевает что-то передать (тот самый мусор!), а затем уже исполняются инструкции, которые его настраивают и дальше высылаются корректные данные.
Не понимаю: в чём смысл оптимизации, если она ломает порядок исполнения инструкций, от которых зависит корректность работы железа?
А можно ли внутри исходника как-то отключать перемешивание инструкций для участка кода, типа сделать его "атомарным", но без ассемблера?