TL; DR
はFreeRTOSのように、マイクロOSを使用してください。
悪い答え
さて、あなたは何のOS、ないタスク整流を持っていないが、外部タイマーを持っている場合、あなたは 次のアプローチを使用することができます。
お使いのハードウェアタイマの割り込みを有効にし、管理しますこのinterrutionによって駆動カウンタ:
あなたは
/**timer.c**/
/* The internal counters
* each task have its counter
*/
static int s_timers[NUMBER_OF_TASKS] = {0,0};
/* on each time tick, decrease timers */
void timer_interrupt()
{
int i;
for (i = 0; i < NUMBER_OF_TASKS; ++i)
{
if (s_timer[i] > 0)
{
s_timer[i]--;
}
}
}
/* set wait counter:
* each task says how tick it want to wait
*/
void timer_set_wait(int task_num, int tick_to_wait)
{
s_timer[task_num] = tick_to_wait;
}
/**
* each task can ask if its time went out
*/
int timer_timeout(int task_num)
{
return (0 == s_timer[task_num]);
}
のようなものを持っている必要があります
/**task-1.c**/
/*TASK ID must be valid and unique in s_timer */
#define TASK_1_ID 0
void task_1()
{
if (timer_timeout(TASK_1_ID))
{
/* task has wait long enough, it can run again */
/* DO TASK 1 STUFF */
printf("hello from task 1\n");
/* Ask to wait for 150 ticks */
timer_set_wait(TASK_1_ID, 150);
}
}
/**task-2.c**/
/*TASK ID must be valid and unique in s_timer */
#define TASK_2_ID 1
void task_2()
{
if (timer_timeout(TASK_2_ID))
{
/* task has wait long enough, it can run again */
/* DO TASK 2 STUFF */
printf("hello from task 2\n");
/* Ask to wait for 250 ticks */
timer_set_wait(TASK_2_ID, 250);
}
}
とスケジュール(ここでは大きな単語)タスク::私が思う
/** main.c **/
int main()
{
/* init the program, like set up the timer interruption */
init()
/* do tasks, for ever*/
while(1)
{
task_1();
task_2();
}
return 0;
}
あなたはタイマーのようなものを持っていたら
プログラムのタスク、(上記のコードは簡単にperfectibleです)私が記述したことは、真剣に使われるべきではない不自由な解決策です。
私が与えたコードは、タスクが実行するために減速するとなった場合に何が起こるかのように、問題がいっぱいです...
代わりに、あなた--could--は非常にあるFreeRTOSのように、いくつかのRT Oを使用する必要がありますこの種の問題に役立ちます。
これは中断やシグナルによって行うことができますが、プロセッサをどのようにプログラムするかによって異なります。どのオペレーティングシステムを使用していますか? – purplepsycho
、まったくありません。私はすべてを可能な限り軽くしようとしています。 –
どのように複数のプロセスを実行しますか? – purplepsycho