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 な状態でマウントしていると不意の電源断時にファイルシステムが破壊されます。対策としては

  1. mount -o sync,noatime で Sync(同期)モード、アクセスタイムを記録しない
  2. 書き込み処理後に sync コマンドを実行する

完全ではありませんが何もしないよりは破壊の確立が下がります。

システム起動時に自動的にマウントを行うには以下のようなスクリプトを /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イメージが壊れていた場合の挙動

  • マウントしてみる
    # mount -t minix /dev/mtdblock3 /sram
    VFS: Can't find a Minix or Minix V2 filesystem on device 1f:03.
    mount: wrong fs type, bad option, bad superblock on /dev/mtdblock3,
           or too many mounted file systems
    # echo $?
    32
    終了ステータス32
  • /dev/mtdblock3をfsckでチェックしてみる
    # busybox fsck.minix /dev/mtdblock3
    fsck.minix: bad magic number in super-block
    # echo $?
    8
    終了ステータスは8

関連リンク

コメント

Last-modified: 2009-09-11 (金) 15:01:42 (5333d)