В самом простом потоке потребуется:
- Некоторая память для стекового пространства
- Где хранить свой контекст (т. Е. Содержимое регистра, счетчик программы, указатель стека и т. Д.)
Кроме того, вам нужно реализовать простое «ядро», которое будет отвечать за переключение потоков. И если вы пытаетесь реализовать упреждающий поток, то вам также понадобится периодический источник прерываний. например. таймер В этом случае вы можете выполнить код переключения потоков в прерывании таймера.
Взгляните на процедуры setjmp () / longjmp () и соответствующую структуру jmp_buf. Это даст вам легкий доступ к указателю стека, чтобы вы могли назначить свое собственное пространство стека, и даст вам простой способ захвата всего содержимого регистра, чтобы обеспечить контекст вашего потока.
Обычно функция longjmp () является оболочкой для возврата из команды прерывания, которая очень хорошо подходит для использования функции планирования потоков в прерывании таймера. Вам нужно будет проверить реализацию longjmp () и jmp_buf для вашей платформы.
Попробуйте поискать реализации потоков на более мелких микропроцессорах, которые обычно не имеют ОС. например. Atmel AVR, или Микрочип ПИК.
Например: обсуждение AVRFreaks