
В моей RTOS механизмов взаимоисключений нет, но их можно реализовать.
По крайней мере сделать некоторое минимальное подобие. Полноценную
реализацию всего этого барахла я делать не хочу, т.к. моей целью является
удержания размера ядра на уровне 500-800 байт.
Проще всего зарезервировать в памяти еще один байт — переменную
занятости. И когда один процесс захватывает ресурс, то в эту переменную он
записывает время когда ориентировочно он его освободит. Время идет в
тиках системного таймера которое у меня 1ms.
Если какой либо другой процесс попытается обратиться к этому же
аппаратному ресурсу, то он вначале посмотрит на состояние его занятости,
считает время в течении которого будет занято и уйдет покурить на этот
период — загрузит сам себя в очередь по таймеру. Там снова проверит и так
далее. Это простейший вариант.
Проблема тут в том, что если на один вектор много желающих будет, то
процессы так и будут бегать вокруг да около, словно бухая молодежь вокруг
единственного сортира на площади в период праздничных гуляний. У кого
нибудь да мочевой пузырь не выдержит — запорет алгоритм. А у кого тут
фиг угадаешь, т.к. промоделировать это будет сложновато.
Решение проблемы — добавление еще одной очередной цепочки, на этот раз
уже на доступ к ресурсу. Чтобы он не простаивал вообще. Т.е. один
выскочил, тут же второй, третий и так далее пока все процессы не справят
свою нужду в какой нибудь там USART.
Недостаток очевиден — еще одна очередь это дополнительная память,
дополнительный код, дополнительное время. Можно, конечно, извратиться и
на очередь к вектору натравить код диспетчера основной цепи. Но тут надо
все внимательно отлаживать, ведь вызываться он будет по прерыванию! Да и
громоздко, требуется лишь тогда, когда у нас много желающих.