C言語でコルーチン(co-routine)

C言語でコルーチンを実装してみる。

コルーチン(co-routine)とはプログラミングの構造の一種。サブルーチンがエントリーからリターンまでを一つの処理単位とするのに対し、コルーチンはいったん処理を中断した後、続きから処理を再開できる。接頭辞co-は協調を意味するが、複数のコルーチンが中断/継続により協調動作を行う。

組み込みシステムではよく、複数の処理を同時に行う必要がある。そのような場合、コルーチンが使えれば、処理の記述が楽に行える。switch-caseあるいは関数テーブルなどを駆使すれば、実現することは可能だが、見通しがわるくなる。

コルーチンをサポートする言語にはModula-2、Simula、Icon、Lua、C#がある。マルチスレッドで原理的には同じことができるため、現在はそちらが使われるケースが多い。

組み込みシステムにおいても上記のことは言えるが、小規模なシステムの場合、リソースの制約上、処理1つ1つにタスクを割り当てることができず、1つのタスクで複数の処理を実行するケースも存在する。

今回、紹介するコルーチンはswitch-caseを巧みに利用して実現されている。次のコードは呼び出すごとに"Hello World"がテキトーになっていくHelloWorld関数だ。
void helloworld(void){
co_begin;

printf("hello world!!\n");
co_yield();

printf("hi world!\n");
co_yield();

printf("hi again.\n");
co_yield();

printf("hi\n");
co_yield();

printf(":)\n");
co_end;
}
main(){
helloworld();
helloworld();
helloworld();
helloworld();
helloworld();
}
実行結果は次の通り。
hello world!!
hi world!
hi again.
hi
:)
見慣れないキーワードが三つ。それぞれ簡単に説明すると、
  • co_begin
    コルーチンの開始
  • co_yield()
    処理の中断
  • co_end
    コルーチンの終了
co_begin,co_endはおまじないと思ってくれ。co_yieldについて説明しよう。
co_yieldは呼び出した時点で処理を中断し関数を抜けるんだ。次にこの関数が呼ばれた時、最後にco_yieldを呼び出したところから処理が再開される。
さて、気になるco_begin,co_yield(),co_endの実装を見てみよう。

#define co_begin              \
static int __state = 0; \
switch(__state){ \
case 0:

#define co_yield() \
do { \
__state = __LINE__; \
return; \
case __LINE__: \
break; \
} while(0);

#define co_end \
__state = __LINE__; \
}
うーん。なかなか良く出来たコードだ。switch-caseを巧みに利用しているのがわかる。もちろんこのマクロは完璧ではない。ローカル変数は使えないし、外部から状態を制御できない。PICなんかだと、1度動作を開始させた後、処理を止める必要がない場合が多いので、今回のマクロで十分かもしれない。

次回は、このコルーチンマクロをもう少し使い易く、ローカル変数を使えるようにしてみる。

コルーチン - Wikipedia
http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%AB%E3%83%BC%E3%83%81%E3%83%B3

コメント

Secret

Ads by Google
最近の記事
カテゴリ
テルミン (5)
スタバカップアンプ (8)
電光掲示板 (4)
Arduino (25)
Make: (19)
太陽電池 (12)
ニキシー管 (17)
PICライタ (15)
自作USBデバイス (6)
電波時計 (3)
Ogg Vorbis Player (12)
電子工作 (69)
Xfind (6)
Cocoa (18)
Bluetooth (3)
twitter (4)
Coroutine (4)
本 (3)
Android (1)
未分類 (21)
Make Controller (1)
Amazon.co.jp
最近のコメント
arms22:Make: Tokyo Meeting 04 行ってきました。 (11/24)
kuma3:Make: Tokyo Meeting 04 行ってきました。 (11/24)
arms22:Make: Tokyo Meeting 04 行ってきました。 (11/24)
LIC:Make: Tokyo Meeting 04 行ってきました。 (11/24)
yatto:Arduinoで遊ぼう - LEDドットマトリクス (10/30)
arms22:スタバカップアンプに最適なスピーカ (10/28)
まりす:スタバカップアンプに最適なスピーカ (10/28)
arms22:Arduinoで遊ぼう - LEDドットマトリクス (10/28)
最近のトラックバック
以前の記事
リンク
タグ
プライバシーポリシー
当サイトでは、第三者配信による広告サービスを利用しています。このような広告配信事業者は、ユーザーの興味に応じた商品やサービスの広告を表示するため、当サイトや他サイトへのアクセスに関する情報 (氏名、住所、メール アドレス、電話番号は含まれません) を使用することがあります。このプロセスの詳細やこのような情報が広告配信事業者に使用されないようにする方法については、ここをクリックしてください。