アットウィキロゴ

解答例3-3

■ ex3-3.c

#include
#include "kernel_id.h"
#include "ex3-3.h"

#define PB_DDR (*(volatile unsigned char *)0xFFFFD4)
#define PA_DDR (*(volatile unsigned char *)0xFFFFD1)
#define PB_DR (*(volatile unsigned char *)0xFFFFD6)
#define PA_DR (*(volatile unsigned char *)0xFFFFD3)

void task1(VP_INT exinf)      // LED点滅タスク
{
    long int w;

    PB_DDR = 0xFF;
    PB_DR = 0xFF;
    
    while(1)
    {    
        PB_DR &= ~0x1;
        for (w=0;w<0x8FFFFF;w++);
        PB_DR |= 0x1;
        slp_tsk();
        wup_tsk(TASK2);
    }
}

void task2(VP_INT exinf)
{
    long int w = 0;

    while(1)
    {    
        PB_DR &= ~0x2;
        for (w=0;w<0x8FFFFF;w++);
        PB_DR |= 0x2;
        slp_tsk();
    }
}

void task3(VP_INT exinf)      // LED点滅タスク
{
    long int w = 0;

    while(1)
    {    
        PB_DR &= ~0x4;  // PB0点灯
        for (w=0;w<0x8FFFFF;w++);
        PB_DR |= 0x4;  // PB0消灯
        wup_tsk(TASK1);
    }
}

 
■ex3-3.cfg

#define _MACRO_ONLY
#include "ex3-3.h"

INCLUDE("\"ex3-3.h\"");

CRE_TSK(TASK1, { TA_HLNG|TA_ACT, (VP_INT)0, task1, HIGH_PRIORITY, STACK_SIZE, NULL });
CRE_TSK(TASK2, { TA_HLNG|TA_ACT, (VP_INT)0, task2, MID_PRIORITY, STACK_SIZE, NULL });
CRE_TSK(TASK3, { TA_HLNG|TA_ACT, (VP_INT)0, task3, LOW_PRIORITY, STACK_SIZE, NULL });

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

■ex3-3.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 exinf);
extern void    task2(VP_INT exinf);
extern void    task3(VP_INT exinf);

#endif /* _MACRO_ONLY */

 

 

最終更新:2014年11月26日 15:09