ОС уже имеет миниальную поддержку событий и задержек. То есть, с задержками уже всё хорошо, а вот с событиями не очень.
читать дальшеНапример, одно событие слушает несколько процессов. Тогда успеет тот, который первый поймает. Остальные уже и не узнают, пока и им не повезёт.
Для предотвращения сего система событий немного изменена! Теперь структура TProcess в поле Event хранит не указатель, а идентификатор.
И процедура FireEvent просматривает таблицу и самостоятельно делает всё, что надо, если найдёт, что событие слушается кем-то. И только если не найдёт слушателей, то посмотрит таблицу зарегистрированных событий и запишет код события туда.
Процедура WaitForEvent сначала смотрит зарегистрированные события и реагирует на код, записанный в соответствующую переменную. Если там ноль или событие не зарегистрировано, то она записывает в таблицу процессов флаг F_EVENT и соответствующий код.
То есть теперь не обязательно регистрировать событие, чтоб его сигнализировать или ждать.
Ещё важное изменение: добавилась функция ExitProcess, которая обнуляет PID и сигнализирует о завершении процесса всем, кому это интересно. Ну и забирает управление от процесса. При этом идентификатором события является номер слота, а кодом его является код завершения.
То есть для завершения процесса можно вызвать ExitProcess(код завершения).
Наконец-то пригодилась функция nyaos_Stub, адрес которой писался в LR процесса. В ней я добавил svc-вызов функции ExitProcess. При этом, как понятно, в R0 окажется то, что вернул процесс с помощью return =) По-моему, это шикарно.
И завершать процесс можно с помощью return <код_завершения>. Прям как в винде.
Для создания процессов из процессов у функции nyaos_AddProcess я сделал svc-псевдоним CreateProcess.
То есть теперь можно спокойно создавать процессы.
И флагам в аргументе тоже нашлось применение: первый флаг, CP_F_WAIT_FOR_EXIT, позволяет ждать завершения созданного процесса. Как раз с помощью того, что ExitProcess извещает о завершении процесса.
И тоже очень просто: записываем в запись о текущем процессе, в Flags бит F_EVENT и в Event номер процесса. И передаём управление дальше. А там уже всё сделается само.
Теперь по событию нажатия/отпускания кнопки создаётся дочерний процесс SlaveProcess (с ожиданием его завершения), в котором моргает на 100 мс светодиод и процесс завершается. После чего ожидается следующее событие.
Конечно, такая ОС не из сверхбыстрых или оптимальных. Но работает, как я хочу, чем меня очень радует =)
Использовать я буду что-то типа FreeRTOS, а это так, для изучения принципов.
Интересные файлы:
main.c
nyaos_api.c
nyaos_core.s
Проект.<< Предыдущее Следующее >>
@темы:
arm,
программизмы,
электроника,
stm32f4discovery,
stm32