プロローグ

第5回 SuperHオープンフォーラム
を見てきました。


ルネサステクノロジはSuperHを、プロセッサ系コントローラ系と分けて、展開していくようです。
マルチタスクの組み込みOSを積んだ物はプロセッサ系となるかと思えば、制御に近いものはコントローラ系としていくような感があります。


SH-4コアとDDR-SDRAMをワンチップ化したものもの計画も紹介されましたが、これはプロセッサ系でしょうし、SH-2Aはコントローラ系になるでしょう。
しかしながら、やはり、速いCPUをコントローラとして使いたいのも心情であり、OSを積むにはメモリが不足したりします。


偶然にも最近、こんな話を聞いてしまったのです。
・無線動かしているんだ!OSは?
・メモリカード読んでいるんだ! OSは何?



「OSなんか積んでないよ!」
 そのときは、苦笑しましたけど、これって、
コントローラ系なんですよね。

いきなり、本題 (゜-゜)

いろいろ怒られそうだけど、OSなんかなくてもRAMにファイル置いておいて、読むくらいのことは出来た。
1箇所バグがあったと思う。

#include <h8/reg770x.h>
#include <h8/ramaccess.h>
#define RAM0BASEADDRESS ((volatile char *)(0xa0010000+0x20000))
#define    SRAMBASE (volatile unsigned long *) 0xb0000000

int open(char *,int);
int read(int,char*,int);
int close(int);

struct    ramd{
    char    fname[30];// 0-29
    char    number;// 30
    int    status;//Read,Write,Close 32
    long    Address;// 36
    long    DataSize;// 40
    long    DataBaseAddress;//44
    long    DataCurrentAddress;//48
};

    struct ramd framd[];


int open(char *filename,int status){
    volatile unsigned char *ptr;
    ptr=RAM0BASEADDRESS;

    volatile unsigned long *ptr2; 
    ptr2 =SRAMBASE;

    int i=0;
    int j=0;

/* Make struct of File */
    while(*ptr !=0xff){
        framd[i].number =i;
        framd[i].Address =(int )ptr;
    
        while(*ptr != 0x00){
            framd[i].fname[j++] =*ptr++;
        
        };
        framd[i].fname[j] =0x00;

//        framd[i].status =0;
        framd[i].DataSize =*(ptr +1) +(*(ptr +2)<<8)+(*(ptr +3)<<16)+(*(ptr +4)<<24);
        framd[i].DataBaseAddress =(long )(ptr +5);
        framd[i].DataCurrentAddress =framd[i].DataBaseAddress;
        ptr +=5;
        ptr +=framd[i].DataSize;
/*
        *ptr2++=framd[i].fname[0];
        *ptr2++=framd[i].Address;
        *ptr2++=framd[i].DataSize;
        *ptr2++=framd[i].DataBaseAddress;
        *ptr2++=framd[i].DataCurrentAddress;
*/

        i++;
        j =0;
    }

    framd[i].fname[0] =0xff;

    PJDR =0x40;

/* Search File */
    i =0;
    char *fn =filename;
//    fn ="456.txt";

    while(framd[i].fname[0] !=0xff){
        if (strcmp(&framd[i].fname[0],fn) ==0){
            framd[i].status =status;
            return i;
        }    
        i++;
    };

    return -1;//Not Found
}


int read(int fp,char* buffer,int size){

    volatile unsigned long *ptr2; 
    ptr2 =SRAMBASE;
    volatile char *src,*dest;

    int rsize =framd[fp].DataSize -(framd[fp].DataCurrentAddress - framd[fp].DataBaseAddress);
    if (size > rsize){
        size =rsize;
    }
//    buffer =(char *)framd[fp].DataCurrentAddress;

    src =(char *)framd[fp].DataCurrentAddress;
    dest =buffer;             

    while (rsize-- >0){
        *dest++ =*src++;
    }

    framd[fp].DataCurrentAddress +=size;

//    *ptr2++ =framd[fp].DataCurrentAddress;
//    *ptr2++ =rsize;
//    *ptr2++ =framd[fp].DataSize;

    return size;
}

int close(int fp){
    framd[fp].status =0;
    framd[fp].DataCurrentAddress =framd[fp].DataBaseAddress;
    return 0;
}





タイマー割り込みも使える。
sleep関数を実現?した。


#include<h8/reg770x.h>

//#define saveregs (int *)0x8c001020
//#define system_call 0x80016ec0
//#define TMU0_RAMVECTOR *(volatile int *)0x8c000280
//extern __time_int

void init_tmu0(void);
void start_tmu0(void);
void stop_tmu0(void);
int interval(void);
volatile unsigned char tcnt0_flag;

/*
int main(void){
    PJCR =0;
    PJDR =0x80; LEDを消して
    stop_tmu0();
    init_tmu0();
    start_tmu0();
    while(1){}
}
*/


void system_call(void){

}

void init_tmu0(void){

    IPRA |=0xf000;//TMU0 IntLevel =15
    TOCR =0;//Set TCLK Pin as Input(not use)
    TCR_0 =0x0023;//UNF(Interrupt Enable),P/256 - (14765600*2)/256 =8.668micoSec
//    TCOR_0 =115;//1mSec
    TCOR_0 =115367;//1Sec

}

void sleep(int count){
    IPRA |=0xf000;//TMU0 IntLevel =15
    TOCR =0;//Set TCLK Pin as Input(not use)
    TCR_0 =0x0023;//UNF(Interrupt Enable),P/256 - (14765600*2)/256 =8.668micoSec
//    TCOR_0 =115;//1mSec
    TCOR_0 =count * 115;
    start_tmu0();
    while(tcnt0_flag == 0){};
    stop_tmu0();
}

void start_tmu0(void){
    tcnt0_flag =0;
    TSTR |=1;//Start TCNT0

}

void stop_tmu0(void){
    TSTR &=0xfe;//Stop TCNT0
    TCR_0 =0x0003;//UNF(Interrupt DisEnable),P/256 - fclk*2/256 =
    IPRA &=0x0fff;//TMU0 IntLevel =0

}

int interval(void){
    TSTR &=0xfe;//Stop TCNT0
    TCR_0 =0x0003;//UNF(Interrupt DisEnable),P/256 - fclk*2/256 =
    tcnt0_flag =1;
    PJDR =0x40; タイマ割り込みでLEDを点ける。
}




あと、シリアルの送受信くらいできれば、そこそこ使えそう。

そうそう、CPUごとのスタートアップを用意しておかなければならない。

つづく