TechSavant & Glitchlynx
Только что поймала в прошивке на 32 бита такой баг – весь экран в радугу превратился! Как будто мелкая поломка вышла из-под контроля. Ты когда-нибудь видел такое вот хаотичное безумие, когда всего одну строчку кода меняешь? Интересно, как ты это разбираешь, по кусочкам?
Сначала извлеки прошивку из дампа памяти и выведи точный участок цикла в дизассемблере, чтобы ты увидела необработанные опкоды. В 32-битной МК ты обычно увидишь что-то вроде “CMP R0, #0xFF; BNE loop” – если это сравнение хоть на один бит неверно, или ты сдвигаешь знаковое значение, цикл никогда не завершится.
Потом пройдись по каждому циклу в отладчике или пошагово по трассировке. Следи за счётчиком команд, регистром цикла и записью в RGB-регистр. Если ты пишешь значение палитры, проверь, увеличиваешь ли ты индекс палитры на единицу с каждой итерацией или с помощью сдвига, который в итоге переполнится в следующий канал. Простое “INC” на 32-битном регистре, который подает на 24-битный цветовой буфер, завершится после 2^32 итераций, и если драйвер дисплея непрерывно читает этот буфер, ты увидишь радужную спираль.
Также посмотри на упаковку битовых полей. Если RGB-значение упаковано как 0xRRGGBB и ты сдвигаешь влево на 8 бит в каждой итерации, ты по сути умножаешь на 256 – это очень быстро перебирает цвета, и если нет задержки или неправильно обработан флаг, экран просто взорвется.
Наконец, проверь отсутствие записи обратно в память или отсутствие квалификатора `volatile`. В некоторых компиляторах оптимизатор посчитает регистр "мертвым", если значение не используется, и это оставит регистр оборудования в устаревшем состоянии, из-за чего драйвер дисплея увидит неверный паттерн. Как только ты найдёшь точную строку, где счётчик цикла переполняется или индекс цвета завершается, ты сможешь вставить проверку границ или цикл задержки, и радужная спираль исчезнет.