вручную
фактически писать и эмулировать "переключение контекста". Где-то это написать слишком сложно, почти невозможно по массе разных причин. Иногда потому что код чужой. Иногда потому что вдобавок код очень сложен. Иногда потому что нельзя предсказать время его выполнения даже в виде ограничения. Иногда потому что это придется делать в слишком многих местах. Типичный такой пример - распаковка файла архиватором (включая JPEG для GUI). Так вот, там где есть бэкграундные процессы, возвращать управление из которых долго, сложно, муторно и почти невозможно (обычно это потоковые процессы по своей природе - отдача в сеть, общение с сетью, общение с USB, распаковка, слив из внешего FLASH, одновременная фоновая загрузка с дискеты =) ) - RTOS с вытесняющей многозадачностью полезна. Если глобальную задачу, т.е. прошивку микроконтроллера можно написать в виде кооперативной многозадачности коротких "подзадач" - RTOS не требуется. Причина в том что кооперативная многозадачность, пусть и в примитивном виде, тут и так реализована.