January 4th, 2017

worklog: графикс(3).

Не могу победить баг с DMA, потому что я не понимаю его причину.
Думал, дело в выравнивании (хотя о нём ни слова в доках) - не помогает.
Думал, дело в самом значении адреса массива, откуда данные читаются - сдвинул, не помогает.
Меня терзают сомнения по поводу ширины этой дефективной полосы - уж очень похоже на 32 (точно не могу сказать, даже под микроскопом пробовал пикселы посчитать - то ли 30, то ли 31, х.з.), а это число явно на случайное.

Кроме того, экран всё равно дёргался. Причём не весь, а только его левая-верхняя четверть (примерно), и только если изображение содержит высокочастотные компоненты (т.е. если не равномерная заливка одним цветом, а случайные линии). Постепенно до меня дошло, что всё дело в целочисленном делении, из-за чего тактовая частота ядра видеочипа неточно преобразуется в частоту сдвига пикселов и накалпивающаяся ошибка вызывает это самое дрожание. Ради проверки гипотезы подобрал новые константы - теперь кадровая частота 73.892 Гц, частота ядра 144 МГц (и потребление выросло аж на 30 мА по сравнению с предыдущими настройками), частота пикселов почти точно 36 МГц: дрожания нет. Но мне не нравится высокое потребление, надо подумать над другим набором констант.

worklog: графикс(3a).

АХАХАХАХ

НАШЁЛ

АХАХАХАХ

виноват -O3 !! если поставить -O1, то всё работает как должно

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

Не понимаю: в чём смысл оптимизации, если она ломает порядок исполнения инструкций, от которых зависит корректность работы железа?
А можно ли внутри исходника как-то отключать перемешивание инструкций для участка кода, типа сделать его "атомарным", но без ассемблера?