スパイス  組み込み制御装置の受注製作

Z80にマルチタスク機能を
平成26年 5月 3日

 簡単な動作確認
 マルチタスク機能を使って簡単なプログラムを動作させてみます。プログラムの全体を示すのは長すぎるので、主要な部分のみを抜粋します。このプログラムは下記からダウンロードできます。リンカスクリプト(.xls)が絶対パスを含んでいますので配置先に合わせて修正が必要です。
  mult-sample.zip :ダウンロード

動作確認プログラムのリスト(抜粋)
/*  タスク関連の関数宣言
 */
extern bool init_task(uchar no,void (*func)(void));
extern uint switch_sp(uint sp);
extern void task_switch(void);      //misc.xas

int gCount;     //タスク動作を示すためのカウンタ

void task1(void)
{
    for(;;){
        xprintf(SIOA_putc, "task1 %d\n\r", gCount++);
        task_switch();
    }
}

void task2(void)
{
    for(;;){
        xprintf(SIOA_putc, "task2 %d\n\r", gCount++);
        task_switch();
    }
}


void main(void)
{
    uchar c;
    initCTC3();
    initSIOA();
    
    init_task(1, task1);
    init_task(2, task2);
    for(c = 0; c < 3; c++){
        xprintf(SIOA_putc, "main %d\n\r", gCount++);
        task_switch();   //タスク切り替え、無条件に割り込み禁止になる
        //割り込み許可が必要なら、EI命令をここにおく
    }
    while(SIOA_transmitNow())              
        ;
    #asm
        jp 0h   ;モニタプログラムへ
    #endasm
}
 プログラムはタスク1・タスク2を初期化後、メイン関数、タスク1、タスク2の順番で3回ずつ呼び出された後でモニタプログラムに戻ります。各呼び出しでは自身の名前とインクリメントカウンタの値を表示します。実行結果は以下のようになります。



目次 前へ 次へ