Also ich mache das meistens so in der Art:
Code:
unsigned int Timer_1ms;
unsigned char TaskFlags;

#define TASK_1		0
#define TASK_2		1

SIGNAL(SIG_OVERFLOW1)
{	
	Timer_1ms++;
	
	if(Timer_1ms % 5 == 0)
	{
		TaskFlags |= (1 << TASK_1);
	}
	
	if(Timer_1ms % 10 == 0)
	{
		TaskFlags |= (1 << TASK_2);
	}
}

int main(void)
{
	for(;;)
	{
		if(TaskFlags & (1 << TASK_1))
		{
			TaskFlags &= ~(1 << TASK_1);
			Funktion_1();
		}
		
		if(TaskFlags & (1 << TASK_2))
		{
			TaskFlags &= ~(1 << TASK_2);
			Funktion_2();
		}
	}
}
Also jeder Prozess hat ein eigenes Flag in irgendeiner globalen Variable.
Ist eines dieser Flags gesetzt wird in der Hauptschleife entsprechend darauf reagiert und das Flag wieder gelöscht.
In dem Beispiel wird also eine Funktion alle 5ms, und die andere - unabhängig davon - alle 10ms aufgerufen.

Natürlich müssen die Flags nicht zwangsläufig durch einen Timer-Interrupt gesetzt werden, das sollte nur als einfaches Beispiel dienen.



Das dürfte so ziemlich die einfachste Methode sein um "Multithreading" zu simulieren.
(es geht naürlich noch besser, aber das sollte in den meisten Fällen ausreichen)