Rough English Here
 
 
LinuxによるSH4プログラム開発
2/8, 2002: サンプルプログラム "sh4-sample-0.2"をリリース
9/5, 2001: sh4-iplに致命的なバグがあったので,修正しました.
8/31, 2001: 「AP-SH4開発環境 on Linux」を「LinuxによるSH4プログラム開発」 に改題.全体的に更新.
[]

Linux上でHitachi製MPU SH-4 (SH7750)のクロス開発環境を構築します。
ターゲットは アルファプロジェクト 製SH4ボード "AP-SH4-0A"です。 制御用にOSを組み込まずに使用することを想定していますが、 開発環境は主にLinuxSHの成果を使わせてもらいます。

distributionはVine Linux2.1.5を使っていますが、Red Hat系であれば大丈 夫だとおもいます。

クロス開発環境のインストール
SH-Linuxのページ からrpmパッケージをもらってきてインストールします。glibcは"Arch independant packages for host",それ以外は"i386 packages for RedHat 6.2"にあります.

AP-SH4-0Aはデフォルトではbig endianです。

# rpm -ivh binutils-sh4eb-linux-010108-4.i386.rpm
# rpm -ivh gcc-sh4eb-linux-20001120-3.i386.rpm
# rpm -ivh sh-linux-gdb-20001217-1.i386.rpm
# rpm -ivh glibc-sh4eb-linux-2.2.2-1.noarch.rpm

一応,ここにも置いておきます.

ダウンロード
このページで紹介しているプログラムのソースコードです.

ファイル名サイズ日付ライセンス備考
flash_apsh4.tar.gz 21k 3/22, 2001 GPL Flash-APSH4(フラッシュROM書込ツール)
sh4-ipl-0.3.tar.gz 24k 9/5, 2001 GPL SH4-IPL(プログラムローダ)
upload-0.1.tar.gz 9k 8/31, 2001 GPL ファイル転送プログラム
sh4-sample-0.2.tar.gz 14k 2/8, 2002 GPL SH4サンプルプログラム Ver0.2

Flash-APSH4
AP-SH4-0AはフラッシュROMを持っていて,電源投入時に起動するユーザプログラ ムをシリアル経由で書き込めるようになっています.

書き込みはAP-SH4-0Aに付属のWindows用プログラムを使いますが、Linux上でも 書き込みができると便利なので,専用のプログラムを作ってみました.

上から"flash_apsh4.tar.gz"をダウンロードしてください。

以下のようにしてモトローラsrec形式のプログラムを書き込みます。 "flash_apsh4"にオプションをつけないで起動すると使いかたが表示されます。

> flash_apsh4 sample.srec

以下のようなオプションがあります.

  -d, --device=DEVICE   "--device=/dev/ttyS1"のようにしてシリアルポートを指定します.
  -b, --boot            ブートモードで書き込みます.通常は使用しません.
  -s, --swap            エンディアンを逆にして書き込みます.
  -t, --test            書き込みを行わず,転送テストのみ行います.
  -h, --help            へルプを表示します.

SH4-IPL
SH4-IPL(SH4 Initial Program Loader)は電源投入時に起動して,ユーザプログ ラムをシリアルポート経由でRAM上に転送して実行するためのプログラムです.
現在のところモトローラsrec形式にのみ対応しています.

前出のFlash-APSH4を使って,フラッシュROMに書き込んで使います.

  1. 上から"sh4-ipl-0.3.tar.gz"をダウンロードしてください。
  2. 解凍してmakeします.クロス開発環境をインストール済みなら"make"と打 つだけです.
  3. フラッシュROMに書き込みます.SH4ボードとホストPCをシリアルケーブル で接続して,電源を入れます.

    > flash_apsh4 sh4-ipl.srec
    

    を実行して,SH4ボードをリセットするとプログラムを転送します.しばらくす るとフラッシュROMへの書き込みが完了します.

  4. ターミナルプログラムを起動して,シリアルポートを"115200bps,8bit, パリティなし,ストップビット1bit"に設定してください.SH4ボードをリセッ トしてブートメッセージが表示されることを確認してください.
upload
SH4-IPLにユーザプログラムを転送するには,

> cat sample.srec > /dev/ttyS0

のようにシリアルデバイスにsrecファイルをcatするだけでいいのですが,転送 用のプログラムも作ってみました.転送状況を表示してくれるので大きなプログ ラムを転送するときは便利です.

  1. 上から"upload-0.1.tar.gz"をダウンロードしてください。
  2. 解凍してmakeします."make; make install"とすれば,/usr/local/bin/に "upload"というコマンドがインストールされます.
使い方は

> upload sample.srec

のようにするだけです.デフォルトではシリアルデバイスは"/dev/ttyS0"になっ ています.変えたい場合はソースを変更してください(^^;

サンプルプログラム
いろいろな機能を試すことができるサンプルプログラムを用意しました。
ロボット制御用のプログラムなどはこのサンプルプログラムをベースにして開発 できると思います.

Ver0.1→0.2の変更点 : 割込み中に浮動小数点のレジスタバンクを切替える機能を追加. これにより割込み中に浮動小数点演算をしてもレジスタが破壊されなくなりました.

使い方

  1. 上から"sh4-sample-0.2.tar.gz"をダウンロードしてください。
  2. 解凍してmakeします."make"とすれば,"sample1.srec" "sample2.srec" ができあがります.
  3. minicomなどのターミナルプログラムを起動しておき,"> cat sample1.srec > /dev/ttyS0" または "> upload sample1.srec"などどして プログラムを転送してください.転送が完了すると自動的に実行されます.
以下の機能があります.
  1. 割込み制御機能."sh-intr.[ch]"をご覧ください.
    • 割込み要因を指定してCで書いた関数を登録できます.
    • レジスタの退避などの処理は自動的にやってくれます.
    • 割込みの優先度も指定できます.
    • 以下の関数が用意されています.

      int intr_register (int intr, void *function); /* 割込み用の関数を登録します */
      int intr_unregister (int intr);               /* 登録を抹消します */
      void intr_set_priority (int intr, int pri);   /* 割込みの優先度を指定します */
      void intr_disable(void);                      /* 割込みを禁止します */
      void intr_enable(void);                       /* 割込みを許可します */
      

  2. シリアル通信機能.SCIFを使用します."sh-sci.[ch]"をご覧ください.
    • 送信・受信割込みを使用し,リングバッファを使ったnon-blocking通信が 可能です.
    • 以下の関数が用意されています.

      void scif_init();                             /* SCIFの初期化 */
      int scif_puts(const char *s);                   /* 文字列出力 */
      int scif_putc(unsigned char ch);                 /* 1文字出力 */
      void scif_flush (void);       /* 出力バッファをフラッシュする */
      void scif_disable (void);                 /* SCIFを無効にする */
      int scif_getc();                                 /* 1文字入力 */
      int scif_getcw();            /* 1文字入力(入力があるまで待つ) */
      void scif_put_decimal (long a);                 /* 10進数出力 */
      void scif_put_hex (unsigned long a, int digit); /* 16進数出力 */
      

  3. キャッシュ制御機能."sh-cache.[ch]"をご覧ください.
    • Write-back cacheを使うため高速です.
    • 以下の関数が用意されています.

      void sh_cache_control(int c);  /* キャッシュのON/OFFを行います */
      

  4. 浮動小数点演算機能
    • スタートアップでFPUを初期化しているので,浮動小数点演算が可能です.
    • libmをリンクすることで各種演算用の関数が使用可能です.
    • libcをリンクすることでsprintf()による演算結果の出力が可能です.
  5. glibcの利用
    • いまのところprintf()は使えません.その代わり,sprintf()と scif_puts()を組み合わせて使ってください.
    • glibcをリンクするとバイナリサイズはかなり大きくなります(500kとか).
"sample1"ではタイマ割込み,"sample2"では浮動小数点演算を主に試すことがで きます."sample2"ではglibcがリンクされるため,サイズが大きくなります.
関連情報
LinuxSHプロジェクトのおかげで非常にスムーズに信頼性の高い開発環境を構築 できるようになりました.またg新部氏のsh-ipl+gのソースはプログラムを開発 する上でとても参考になりました.感謝致します.
「AP-SH4開発環境 on Linux」
旧コンテンツ
LinuxSH (SourceForge)
LinuxSH公式ページ
GNU/Linux on SuperH Project
g新部氏のページ
SH Linux
RPMパッケージを配布してくれてます

このページに関するコメントをお願いします
お名前:   ↓タグ使えます
コメント: →他の人のコメント

→最近のコメント


Copyright © 2001 KOMORIYA Takeru リンクはご自由に (参考) →開発レポートにもどる