プロローグ
第5回 SuperHオープンフォーラム
を見てきました。
ルネサステクノロジはSuperHを、プロセッサ系とコントローラ系と分けて、展開していくようです。
マルチタスクの組み込みOSを積んだ物はプロセッサ系となるかと思えば、制御に近いものはコントローラ系としていくような感があります。
SH-4コアとDDR-SDRAMをワンチップ化したものもの計画も紹介されましたが、これはプロセッサ系でしょうし、SH-2Aはコントローラ系になるでしょう。
しかしながら、やはり、速いCPUをコントローラとして使いたいのも心情であり、OSを積むにはメモリが不足したりします。
#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;
}
|
#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を点ける。
}
|