Еще не все. Драйвер сырой. И ОС тоже надо поставить переработанную.
Попробую так сказать по пунктам.
1. В протоколе обмена клавиатуры есть еще как я понял бит четности, но я его пока не обрабатываю пока, хотя и учитываю.
2. Модуль поддержки клавиатуры плонирую разбить на два модуля - "модуль программной эмуляции UART" (полного UART - с поддержкой разных длин символов, четности, разного кол-ва старт-стопов) и собственно "модуль 40кнопочной клавиатуры". Таким образом убъются два зайца - заяц 1й - можно будет с помощю макросов указать - программный или аппаратный UART используется, и - заяц 2й - программный UART можно будет использовать не только для поддержки клавиатуры, но и для других нужд, коли возникнет нужда.
3. Сейчас веду работы по доработке ОС до версии 1.0. Что делается и планируется.
а) Создание интерактивного конфиг-скрипта (наподобие как для линуксового ядра). То есть набираем "make config", на что выдается серия вопросов с подсказками, на которые пользователь вводит ответы (свои или по умолчаию). В результате формируются для каждого модуля файлы конфигурации. Главное достоинство - абсолютно единообразный формат входных файлов для конфиг-скрипта. Уже почти завершено (процентов на 70-80).
б) Изменение структуры каталогов. Теперь каждый проект будет хранится в отдельном подкаталоге ../upl/<имя проекта>. Там же сохраняются все текущие настройки для данного проекта. И там же при компиляции сохраняются временные объектные файлы. Плюсы такого подхода очевидны. Таким образом для многих проектов будет достаточно всего лишь одной копии системы. Ну и простое удобство - глянул в каталог upl и сразу видно - какие проекты есть. Тоже почти готово.
в) Реализация многозадачности. Планирую отказаться от простого фонового цикла, а все пользовательские задачи свести в список и выделять по некоему кванту времени на задачу. Если задача пользователя всего одна - то формировать простой фоновый цикл. Если же несколько - то переключать их по таймеру. Цель - исключить длительные ожидания при выполнении долгих процессов. При этом приоритеты драйверов будут всегда выше приоритетов фоновых задач.
Для пользователя это все выглядит примерно так:
// Определения задач
ttask task0(){/* код задачи 0 */}
ttask task1(){/* код задачи 1 */}
ttask task2(){/* код задачи 2 */}
// Начало списка
USER_TASK_LIST_BEGIN()
USER_TASK_LIST_ADD(task0, stk_size) /*Добавляем задачу 0 в список*/
USER_TASK_LIST_ADD(task1, stk_size) /*Добавляем задачу 1 в список*/
USER_TASK_LIST_ADD(task2, stk_size) /*Добавляем задачу 2 в список*/
// конец списка
USER_TASK_LIST_END()
Правда не следует злоупотреблять этим. Для каждой задачи (если их больше 1й) надо 35байт под регистры (32РОН + 2б SP + SREG). И еще под стек (задается пользователем).
Степень готовности - пока непонятна. Вроде работает - но требует длительной отладки.
Такие вот пироги. В общем если есть какие пожелания - пишите. Проще сейчас, пока модулей мало и структура ОС еще не полностью определена, пожелания учесть, чем потом чтото неучтенное мной в ОС через задний прозход вводить.