Я уже демонстрировал работу эмулятора в полном экране, а также вы видели, что разработку и отладку я веду в "оконном" режиме. И вот я решил по-быстрому сделать переключение этих режимов.
Для начала я сделал включение нужного режима по значению переменной. Задаю значение при компиляции, запускаю, и эмулятор работает в нужном мне режиме. Красота! Осталось только сделать так, чтобы значение переменной менялось по кнопке. И вот тут меня ждала первая засада!
По моей задумке, такое переключение должно сидеть на кнопке PrintScreen. А эта кнопка наряду с Pause/Break зачем-то имеет нестандартный код отличный по размеры от других клавиш. В итоге, хоть ты тресни, при моей организации опроса клавиатуры, PrintScreen распознавался, как Left Control. Ну с этой проблемой относительно быстро я справился, и уже предвкушал переключение режимов, но что-то снова пошло не так. Режимы вообще не захотели переключаются!
При старте системы нужный режим задать можно. Но! Если уже однажды экран задал, то потом он, как гвоздями прибитым оказывается! Максимум чего мне удавалось добиться - это гасить экран. И что там на этом погашеном экране происходит одному богу известно. То ли эмулятор завис, то ли работает про себяОтсутствие зависания я научился определять, написав процедуру сброса Raspberry Pi. Далее вставлял эту процедуру в интересующие места. И если компьютер перезагрузился, значит до этого момента всё шло правильно. А если перезагрузки не произошло, то он где-то там по дороге завис.
Вся беда, что в Интернете вообще ничего не пишут про смену режимов экрана! Всем достаточно просто раз задать параметры и всё, а чтобы потом что-то менять - это никому не нужно. В общем, с этой проблемой я завис почти на неделю. Перво-наперво пришлось начать с того, чтобы полностью разбираться с тем, как ARM общается с GPU, и вникать во все детали, а не вслепую использовать готовый пример инициализации экрана. Здесь я открыл для себя много интересного. Например то, что будучи подключенным к TV по композитному разъёму Raspberry Pi предлагает задать особое разрешение экрана 656*416. И, кстати, подключение к любому старому TV через композитный кабель, да ещё в цвете - это довольно крутая фишка, которую должны оценить ретрокомпьютерщики. Я потом обязательно сделаю оптимизацию картинки для такого типа подключения.
Ну так вот... Когда у меня что-то более менее улеглось в голове по поводу GPU, при моих дальнейших экспериментах у меня экран стабильно начал гаснуть, ну или комп виснуть - сходу этого понять было сложно. На этом этапе я решил внедрять в эмулятор поддержку UART. И у меня даже уже был готовый рабочий пример, который я выгрыз из одной BareMetal программы. Но, как обычно, всё пошло не по плану. Пример, который я перед этим тестировал, отказался работать, хотя пару месяцев назад всё было ОК. Потратив какое-то время я выяснил, что код для обслуживания UART, отказывается работать с новым загрузчиком от производителя Raspberry Pi. После отката на старую версию я, наконец, снов обрёл возможность отправлять что-то в консоль. Но опять же, этот пример работал только если запускать его с SD-карты, а если же загружать по UART, как я и делаю, то этот код будет молчать. Ну хотя бы так. И вот я начал интегрировать этот код к себе в эмулятор. И что бы вы думали? Правильно! У меня ничего не заработало. И снова время на эксперименты и выяснения. Оказалось - конфликт с инициализацией матричной клавиатуры. Инициализацию клавиатуру я временно отключил и после этого худо-бедно заработало. Таким образом мне удалось понять, что темный экран - это чаще всего просто потеря изображения, а не зависание эмулятора.
Но за два дня я изрядно задолбался записывать каждую сборку на SD-карту. И я решил отложить разбирательство с экраном и сосредоточится на UART. Потратив ещё довольно много времени, мне удалось написать правильную инициализацию UART и отправку в него данных. Зато в итоге я получил неконфликтующий с моей матричной клавиатурой код, который теперь к тому же заработал и с новыми системными файлами, и будучи загруженный через UART. Теперь я обрёл возможность по нажатию кнопки получать по UART содержимое регистров ARM. Если сдержал себя от того, чтобы не начать писать полноценный отладчик типа Скорпионовского монитора-отладчика.
Обладая ещё одним средством отладки, я снова вернулся к решению проблемы со сменой режима экрана. У далее меня были сотни всяких экспериментов. Я уже думал, что, наверное, не смогу решить данную задачу. Но мои мучения были в итоге вознаграждены! Мне всё-таки удалось разобраться с проблемой и я научился менять режимы экрана в рамках одной сессии. Аллилуйя!
Переключение режимов экрана в процессе работы эмулятора я потом обязательно засниму на видео, как только кое-что доделаю.
В процессе написания эмулятора знаний по архитектуре Raspberry Pi становится всё больше. Теперь хоть свою OS пишиПравда пока остаётся одни фундаментальный вопрос, за который я пока даже не брался - это поддержка microSD. И беда в том, что я не не нашёл ни одного BareMetal приложения вне рамок сишной библиотеки Circle, которое поддерживало бы SD хотя бы в режиме чтения. Чувствую, что там будет танцев с бубном не на одну неделю...




Отсутствие зависания я научился определять, написав процедуру сброса Raspberry Pi. Далее вставлял эту процедуру в интересующие места. И если компьютер перезагрузился, значит до этого момента всё шло правильно. А если перезагрузки не произошло, то он где-то там по дороге завис.
Ответить с цитированием