解答例3-1

■samp1.c

#include <t_services.h>
#include "kernel_id.h"
#include "samp1.h"

#define PB_DDR (*(volatile unsigned char *)0xFFFFD4)
#define PB_DR (*(volatile unsigned char *)0xFFFFD6)

void main_task(VP_INT exinf)   // メインタスク
{
    PB_DDR = 0xFF;     // PBポート出力設定
    PB_DR = 0xFF; // LED全消灯
    
    act_tsk(TASK1);   // タスク1起動
    act_tsk(TASK2);   // タスク1起動
    
    ext_tsk();        // タスク終了
}

void task1(VP_INT taskno)      // LED点滅タスク
{
    volatile INT i;

    while(1)
    {
        PB_DR |= 1;  // LED全消灯
        for(i = 0; i < 100000; i++);
    
        PB_DR &= ~1;  // LED全点灯
        for(i = 0; i < 100000; i++);

        dly_tsk(0);
    }
}

void task2(VP_INT taskno)      // LED点滅タスク
{
    volatile INT i;

    while(1)
    {
        PB_DR |= 2;  // LED全消灯
        for(i = 0; i < 100000; i++);
    
        PB_DR &= ~2;  // LED全点灯
        for(i = 0; i < 100000; i++);

        dly_tsk(0);
    }
}

 ■samp1.cfg

#define _MACRO_ONLY
#include "samp1.h"

INCLUDE("\"samp1.h\"");
CRE_TSK(MAIN_TASK, { TA_HLNG|TA_ACT, (VP_INT)0, main_task, MAIN_PRIORITY, STACK_SIZE, NULL });
CRE_TSK(TASK1, { TA_HLNG, (VP_INT)1, task1, MID_PRIORITY, STACK_SIZE, NULL });
CRE_TSK(TASK2, { TA_HLNG, (VP_INT)1, task2, MID_PRIORITY, STACK_SIZE, NULL });

#include "../../systask/timer.cfg"
#include "../../systask/serial.cfg"
#include "../../systask/logtask.cfg"

■ samp1.h

#include <t_services.h>

/* 各タスクの優先度の定義*/
#define MAIN_PRIORITY    5        /* メインタスクの優先度 */
                                /* HIGH_PRIORITY より高くすること */
#define HIGH_PRIORITY    9        /* 並列に実行されるタスクの優先度 */
#define MID_PRIORITY    10
#define LOW_PRIORITY    11

#undef CPUEXC1                /* CPU例外ハンドラをサポートしない */

#ifndef TASK_PORTID
#define    TASK_PORTID    1        /* 文字入力するシリアルポートID */
#endif /* TASK_PORTID */

#ifndef STACK_SIZE
#define    STACK_SIZE    8192        /* タスクのスタックサイズ */
#endif /* STACK_SIZE */

#ifndef LOOP_REF
#define LOOP_REF    1000000        /* 速度計測用のループ回数 */
#endif /* LOOP_REF */

/* 関数のプロトタイプ宣言 */
#ifndef _MACRO_ONLY

extern void    task1(VP_INT tskno);
extern void    task2(VP_INT tskno);
extern void    main_task(VP_INT exinf);

#endif /* _MACRO_ONLY */

 

最終更新:2014年11月11日 17:24