ソースコードをみたいと思います.
BlueLabをインストールすると、tutorialフォルダができています.
その中のメッセージハンドラとスケジューラのまとめのソースコードをみてみます.
C:\BlueLab41\apps\tutorials\message_handler
#include <message.h>
メッセージハンドラを利用するためにインクルードします.
#include <stdio.h>
printf()を使うためにインクルードします.
#define DOWN 0
#define UP 1
カウントダウンとカウントアップの定義
typedef struct _count_task_data {
TaskData count_task;
uint8 count;
} CountTaskData;
カウンタの構造体定義です.
countはカウント値です.
count_taskは、カウンタをいじるための関数(メッセージハンドラ)です.
static void count_handler(Task t, MessageId id, Message payload) {
これが、CountTaskData構造体ににひもづけされる関数です.
main()のmessageSend()によって起動されます.
CountTaskData *ctd = (CountTaskData *) t;
Task構造体として入ってくる引数tをCountTaskData構造体にキャストして変数ctdで代用します.
ctdは、下記でstaticで確保したcount_taskを指し示しています.
printf("Count %d\n", ctd->count);
count_task内部のcount値を表示.
if (DOWN == id) { ctd->count--; }
else { ctd->count++; }
初回はmain()のMessageSend()からメッセージUPが届くので、count++になります.
if (ctd->count == 10) { id = DOWN; }
else if (ctd->count == 0) { id = UP; }
count値が10になったらDOWNに転じ、0になったらUPに転ずるようにメッセージを自分で改変します.
MessageSend(t, id, 0);
そしてまた出た.自分で自分にメッセージを送って自分を起動するって言うメッセージハンドラの得意技が.
これって、慣れないとわかりずらい作法だよね.
結果として、count値が0~10をグルグルと回り続けます.
}
static CountTaskData count_task = { { count_handler }, 0 };
CountTaskData構造体の本体をメモリに確保します.
タスクとしてcount_handler()をひもづけします.
カウンタを0に初期化します.
int main(void) {
MessageSend( &count_task.count_task, UP, 0 );
CountTaskData構造体にひもづけた関数、すなわちcount_handler()に対して、UPせよというメッセージを発信します.
MessageLoop();
return 0;
}