
            ＝ TOPPERS/JSPカーネル ユーザズマニュアル ＝
                （ARMv4 ターゲット依存部）

          （Release 1.4.3対応，最終更新: 10-May-2007）

------------------------------------------------------------------------ 
 TOPPERS/JSP Kernel
     Toyohashi Open Platform for Embedded Real-Time Systems/
     Just Standard Profile Kernel

 Copyright (C) 2000-2007 by Embedded and Real-Time Systems Laboratory
                             Toyohashi Univ. of Technology, JAPAN

 上記著作権者は，以下の (1)〜(4) の条件か，Free Software Foundation 
 によって公表されている GNU General Public License の Version 2 に記
 述されている条件を満たす場合に限り，本ソフトウェア（本ソフトウェア
 を改変したものを含む．以下同じ）を使用・複製・改変・再配布（以下，
 利用と呼ぶ）することを無償で許諾する．
 (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作
     権表示，この利用条件および下記の無保証規定が，そのままの形でソー
     スコード中に含まれていること．
 (2) 本ソフトウェアを，ライブラリ形式など，他のソフトウェア開発に使
     用できる形で再配布する場合には，再配布に伴うドキュメント（利用
     者マニュアルなど）に，上記の著作権表示，この利用条件および下記
     の無保証規定を掲載すること．
 (3) 本ソフトウェアを，機器に組み込むなど，他のソフトウェア開発に使
     用できない形で再配布する場合には，次のいずれかの条件を満たすこ
     と．
   (a) 再配布に伴うドキュメント（利用者マニュアルなど）に，上記の著
       作権表示，この利用条件および下記の無保証規定を掲載すること．
   (b) 再配布の形態を，別に定める方法によって，TOPPERSプロジェクトに
       報告すること．
 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     害からも，上記著作権者およびTOPPERSプロジェクトを免責すること．

 本ソフトウェアは，無保証で提供されているものである．上記著作権者お
 よびTOPPERSプロジェクトは，本ソフトウェアに関して，その適用可能性も
 含めて，いかなる保証も行わない．また，本ソフトウェアの利用により直
 接的または間接的に生じたいかなる損害に関しても，その責任を負わない．

 @(#) $Id: armv4.txt,v 1.1 2009/08/23 01:06:39 suikan Exp $
------------------------------------------------------------------------


１．ARMv4 ターゲット依存部の概要


1.1 ターゲットシステムと開発環境

ARMV4 プロセッサのターゲットシステムとしては，ARMv4アーキテクチャのCPU
コアを搭載した以下のボードをサポートしている．なお，Thumb命令はサポー
トしていない．

  ・ARM製の Integrator/CM922T-ETM(ARM922T) + Integrator/AP
  ・YDK製の AZ9360MB(ARM926EJ-S)

開発環境には，GCC などの GNU開発環境を用い，オブジェクトファイルフォー
マットは ELF を標準とする．

Integratorでは，実行間環境としてJTAG-ICEを用いることを想定している．
JTAG-ICEとしては，ARM社製の Multi-ICE と，ソフィアシステムズ製の
UniSTAC II/J ETM for ARM9 で動作確認している．


1.2 サポートする機能の概要

ARMv4 依存の機能として、性能評価用システム時刻参照機能(vxget_tim)をサポ
ートしている。割込みの禁止と許可(dis_int、ena_int)はサポートしていない。


1.3 他のターゲットへのポーティング

他のターゲットにポーティングするためには，システム依存部に以下のコード
が必要となる．
 
  ・割込みの出入り口処理（sys_support.S）
  ・タイマードライバ
  ・シリアルドライバ


1.4 Integrator の初期化


1.5 シリアルポート

Integrator ではIntegrator/AP 上の UART をカーネルログ出力用に使用する．
ディフォルトでは，速度115200bps,データ:8bit,Parity:none,Stop:1bitであ
る。


1.6 Thumbコードについて

Thumbコードの利用については，現時点ではサポートしてない．


２．ARMv4 プロセッサ依存部の機能

この節では、カーネルおよびシステムサービスの機能の中で、ARMv4依存の部分
について解説する。


2.1 データ型

int型および unsigned int型のサイズは 32ビットである。

2.2 割込み管理機能と割込みハンドラ

カーネル管理外の割込みとしては FIQがある。よって、CPUロック状態や初
期化ルーチン内では、FIQ 以外の割込みはすべて禁止されている。具体的には、
CPSR(カレントプログラム状態レジスタ)のIRQ禁止ビット(ビット7)が 1 に設
定される。


DEF_INH で指定する割込みハンドラ番号(inhno)は、KS32C50100 で周辺モジュー
ル毎に定義されている割り込み番号である．LH79532 では割込みコントローラ
の各チャネル番号である。データ型(INHNO)は unsigned int型に定義されてい
る。


2.3 CPU例外管理機能とCPU例外ハンドラ

DEF_EXC で指定する割込みハンドラ番号(excno)は、ARMv4 で定義されている，
例外要因である．そのデータ型(EXCNO)は unsigned int 型に定義されている。
DEF_EXC で、例外コード番号として有効でない値や、CPU例外に対応しない番号
を指定した場合の動作は保証されない。

CPU例外ハンドラに渡されるp_excinfは，CPU例外発生時のコンテキストを保存
したスタックへのポインタが渡される．スタックの構造を以下に示す．


      ----------------------
     |        CPSR          |  <-- p_excinf
      ----------------------
     |         R0           |
      ----------------------
     |         R1           |
      ----------------------
     |         R2           |
      ----------------------
     |         R3           |
      ----------------------
     |         ip           |
      ----------------------
     |         lr           |
      ----------------------
     |         PC           |
      ----------------------


2.4 スタートアップモジュール

ARMv4 依存のスタートアップモジュール(start.S)では、次の初期化処理を行う。

(A) プロセッサモードの初期化とスタックポインタの初期化

最初に、プロセッサモードをスパーバイザーモード(SVC)、IRQ,FIQ割込みを禁止
にする．

次に、スタックポインタ(sp)を STACKTOP に設定する。ここで割込みスタッ
クポインタに設定されたスタック領域は、カーネル起動後は非タスクコンテキ
スト用のスタック領域として使われる。STACKTOP は、sys_config.h 部で定義
することを想定している。

(B) hardware_init_hook の呼出し

hardware_init_hook が 0 でない場合には、hardware_init_hook を呼び出す。
hardware_init_hook は、カーネルが起動される前に行う必要があるターゲッ
ト依存の初期化を行うために用意している。hardware_init_hook がどこでも
定義されていない場合、リンカでこのシンボルを 0 に定義する(リンカスク
リプト内に記述あり)。

(C) bssセクションと dataセクションの初期化

bssセクションをゼロクリアする。また、dataセクションを初期化する。

(D) software_init_hook の呼出し

software_init_hook が 0 でない場合には、software_init_hook を呼び出す。
software_init_hook は、カーネルが起動される前に行う必要があるソフトウェ
ア環境(具体的には、ライブラリ)依存の初期化を行うために用意している。
software_init_hook がどこでも定義されていない場合、リンカでこのシンボ
ルを 0 に定義する(リンカスクリプト内に記述あり)。

(E) カーネルの起動

kernel_start へ分岐し、カーネルを起動する。kernel_start からリターンし
てくることは想定していない。



３．システム依存部の機能


3.1 システムクロックドライバ

システムクロックドライバが isig_tim を呼び出す周期は、sys_defs.h 中の 
TIC_NUME と TIC_DENO で定義されている(標準は 1ミリ秒周期)。この定義
を変更することで、isig_tim を呼び出す周期を変更することができる。ただ
し、タイマの精度が 1μ秒であるため、1μ秒単位で端数になる値を設定した
場合には、isig_tim の呼出し周期に誤差が生じることになる。


3.2 性能評価用システム時刻参照機能

ARMv4 依存部では、性能評価用システム時刻参照機能(vxget_tim)をサポートし
ている。性能評価用システム時刻の精度は 1μ秒単位であるが、タイマの現在値
を読み出すために一時的にタイマを停止させる必要があるため、vxget_tim を呼
ぶ度にシステムクロックが少しづつ遅れることになる。なお、SYSUTIM型は UD型
(64ビットの符号無し整数型)に定義している。


3.3 シリアルインタフェースドライバ

Integrator 依存部では，Intergrator/AP上の UART をサポートしている．


４．開発環境の構築

開発環境の構築方法については，GNU開発環境構築マニュアルを参照のこと．


4.1 開発環境のバージョン
動作確認したツールのバージョンは以下の通りである．

    BINUTILS : 2.11.2
    GCC-CORE : 3.0.2
    GDB      : 5.0
    NEWLIB   : 1.9.0

もしくは

    BINUTILS : 2.14
    GCC-CORE : 3.3
    GDB      : 5.3
    NEWLIB   : 1.11.0

4.2 ツールソースの修正
上記のバージョンのツールを構築するさい以下の修正が必要となる．

4.2.1 GDB
   ./gdb/rdi-share/devsw.c
     39行目，69行目 のstruct tm lmの宣言している行をコメントアウトする．
   

4.3 GDBスタブによるプログラムのダウンロード
     ホストPCとボードをシリアルケーブルで繋ぎ，gdbにダウンロードしたい
     プログラムを指定する．
     次に以下のコマンドを実行する．ttySXXのXXはシリアルを接続してい
     るポート番号である．

           set remotebaud 57600 
           set endian little 
           set rdi /dev/ttySXX 
      後は，loadでプログラムをダウンロードして，continueで実行する．
      また，Ctrl-Cで動作中のプログラムを停止できる．



５．その他

5.1 ディレクトリ・ファイル構成

ARMv4 ターゲット依存部の各ファイルの概要は次の通り．

    config/armv4/
        Makefile.config MakefileのARMv4依存定義
        armelf.ld       ビッグエンディアン用リンカスクリプト
        armv4.h         ARMv4の定義
        cpu_config.c    プロセッサ依存部の関数
        cpu_config.h    プロセッサ依存部の構成定義
        cpu_context.h   コンテキスト操作
        cpu_defs.h      プロセッサ依存部のアプリケーション用定義
        cpu_insn.h      低レベルのプロセッサ操作ルーチン
        cpu_rename.def  カーネルの内部識別名のリネーム定義
        cpu_rename.h    カーネルの内部識別名のリネーム
        cpu_support.S   プロセッサ依存部のサブルーチン
        cpu_unrename.h  カーネルの内部識別名のリネーム解除
        makeoffset.c    offset.h 生成サポートプログラム
        start.S         スタートアップモジュール
        tool_config.h   開発環境依存部の構成定義（GNU開発環境用）
        tool_defs.h     開発環境依存部のアプリケーション用定義（GNU開発環境用）

    config/armv4/integrator
        Makefile.config Makefileの Integrator 依存定義
        hw_serial.cfg   SIOドライバのコンフィギュレーションファイル
        hw_serial.h     SIOドライバ
        hw_timer.h      タイマ操作ルーチン
        integrator.c    Integrator ハードウェア操作関数
        integrator.h    Integrator ハードウェア定義
        integrator.ld   Integrator リンカスクリプト
        sys_config.c    システム依存部の関数
        sys_config.h    システム依存部の構成定義
        sys_defs.h      システム依存部のアプリケーション用定義
        sys_rename.def  カーネルの内部識別名のリネーム定義
        sys_rename.h    カーネルの内部識別名のリネーム
        sys_support.S   システム依存部のサブルーチン
        sys_unrename.h  カーネルの内部識別名のリネーム解除
