|
SRAMの使い方 †CAT709はバッテリーバックアップされた512Kバイトのsramが搭載されています。このsramは /dev/mtdblock3 デバイスとして認識されています。 ファイルシステムとしてマウントする使い方 †/dev/mtdblock3 は通常のデバイスと同じく「512Kバイトの大きさのメディア」ですので、なんらかのファイルシステム形式でフォーマットしてからマウントします。ファイルシステム形式としてはext2やminix等が考えられます。CAT709/CAT760では小さな領域に最適なminixのフォーマットコマンドがインストールされています。 # mkdir /sram # mkfs.minix /dev/mtdblock3 # mount -t minix -o sync,noatime /dev/mtdblock3 /sram 基本は上記の形になります。ただし、 read/write な状態でマウントしていると不意の電源断時にファイルシステムが破壊されます。対策としては
完全ではありませんが何もしないよりは破壊の確立が下がります。 システム起動時に自動的にマウントを行うには以下のようなスクリプトを /etc/init.d/mountsram として用意すると良いでしょう。 #! /bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin set -e case "$1" in start) echo -n "Mounting sram " mount -t minix /dev/mtdblock3 /sram || ( echo "sram broken, fsck and mount" && mkfs.minix /dev/mtdblock3 && mount -t minix -o sync,noatime /dev/mtdblock3 /sram ) echo "done" ;; stop) echo -n "Unmounting sram " umount /dev/mtdblock3 echo "." ;; *) N=/etc/init.d/$NAME echo "Usage: $N {start|stop}" >&2 exit 1 ;; esac exit 0 解説;引数 start が指定されたときはmountを行う。mountエラーの際にはフォーマットを行ってからマウントする。引数 stop が指定されたときはアンマウントを行う。 このスクリプトを /etc/rcS.d からシンボリックリンクを張ることで起動時に自動的にsramのマウントを行います。 # cd /etc/rcS.d # ln -s ../init.d/mountsram S36mountsram.sh プログラムから直接ワークエリアとして使う方法 †SRAMをプログラムからポインタ変数で直接アクセスすることもできます。mmap()は「ファイルをmalloc する」という感覚でつかえます。ファイルをmmap()すれば、戻りポインタのメモリ上にファイルが張り付いているように見えます。ファイルの代わりにデバイス/dev/mtdblock3 をmmap() すれば、戻りポインタにSRAM が張り付いているように見えるわけです。 /* SRAM mmap test program 2004-06-26 SiliconLinux y.ebihara */ #define SRAMSIZE (4*1024) /* SRAM 4Kbyte */ #include <stdio.h> #include <fcntl.h> #include <sys/mman.h> int main(){ int fd; unsigned char *sram; printf("this is sram test program No.1 2004-06-26 Y.Ebihara\n"); /* SRAM デバイス /dev/mtdblock3 をopen する*/ fd=open("/dev/mtdblock3",O_RDWR); if(fd<=0){ perror(""); exit(1); } /* fd を使ってmmap する(ポインタが戻る)*/ sram=mmap(0,SRAMSIZE,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); if(sram<0){ perror(""); exit(1); } printf("SRAM mmaped at %p\n",sram); /* そのポインタを使ってアクセスする*/ sram[0]=0x12; sram[1]=0x34; sram[2]=0x56; sram[3]=0x78; /* SRAMの先頭4バイトに書き込まれました */ /* SRAM と同期をとる(ハードへの書き込み)*/ msync(sram,SRAMSIZE,MS_SYNC); /* mmap を閉じる*/ munmap(sram,SRAMSIZE); /* デバイスを閉じる*/ close(fd); } 実行結果 # ./sramtest this is sram test program No.1 2004-06-26 Y.Ebihara SRAM mmaped at 0x2956a000 # hex /dev/mtdblock3 0x00000000: 12 34 56 78 00 00 00 00 - 00 00 00 00 00 00 00 00 R4Vx@@@@@@@@@@@@ 0x00000010: 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 @@@@@@@@@@@@@@@@ メモ †SRAMイメージが壊れていた場合の挙動 †
関連リンク †コメント † |