
		TOPPERS/ATK2-SC1
        ＜V850依存部設計メモ＞

このドキュメントはV850プロセッサ依存部の設計メモを記述したものである．

----------------------------------------------------------------------
TOPPERS ATK2
    Toyohashi Open Platform for Embedded Real-Time Systems
    Automotive Kernel Version 2

Copyright (C) 2013-2014 by Center for Embedded Computing Systems
            Graduate School of Information Science, Nagoya Univ., JAPAN
Copyright (C) 2013-2014 by FUJISOFT INCORPORATED, JAPAN
Copyright (C) 2013-2014 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
Copyright (C) 2013-2014 by Renesas Electronics Corporation, JAPAN
Copyright (C) 2013-2014 by Sunny Giken Inc., JAPAN
Copyright (C) 2013-2014 by TOSHIBA CORPORATION, JAPAN
Copyright (C) 2013-2014 by Witz Corporation, JAPAN

上記著作権者は，以下の (1)～(3)の条件を満たす場合に限り，本ドキュメ
ント（本ドキュメントを改変したものを含む．以下同じ）を使用・複製・改
変・再配布（以下，利用と呼ぶ）することを無償で許諾する．
(1) 本ドキュメントを利用する場合には，上記の著作権表示，この利用条件
    および下記の無保証規定が，そのままの形でドキュメント中に含まれて
    いること．
(2) 本ドキュメントを改変する場合には，ドキュメントを改変した旨の記述
    を，改変後のドキュメント中に含めること．ただし，改変後のドキュメ
    ントが，TOPPERSプロジェクト指定の開発成果物である場合には，この限
    りではない．
(3) 本ドキュメントの利用により直接的または間接的に生じるいかなる損害
    からも，上記著作権者およびTOPPERSプロジェクトを免責すること．また，
    本ドキュメントのユーザまたはエンドユーザからのいかなる理由に基づ
    く請求からも，上記著作権者およびTOPPERSプロジェクトを免責すること．

本ドキュメントは，AUTOSAR（AUTomotive Open System ARchitecture）仕様
に基づいている．上記の許諾は，AUTOSARの知的財産権を許諾するものではな
い．AUTOSARは，AUTOSAR仕様に基づいたソフトウェアを商用目的で利用する
者に対して，AUTOSARパートナーになることを求めている．

本ドキュメントは，無保証で提供されているものである．上記著作権者およ
びTOPPERSプロジェクトは，本ドキュメントに関して，特定の使用目的に対す
る適合性も含めて，いかなる保証も行わない．また，本ドキュメントの利用
により直接的または間接的に生じたいかなる損害に関しても，その責任を負
わない．

$Id: prc_design.txt 549 2015-12-30 10:06:17Z ertl-honda $
----------------------------------------------------------------------

このドキュメントは，V850E2依存部の設計メモである．作成中のものであり，
網羅的ではない．GHSに関連した事項もこのメモに記載する．
  
---------------------------------------------------------------------
既知の問題
---------------------------------------------------------------------
・(GCC) -msoft-float
  ・gcc 4.7(v12.02)では-msoft-floatオプションが無くなっている．

・(GCC)CubeSuite+(V1.03.000)のLMA非対応
  ・初期値付き変数のためにVMAとLMAが異なるelfファイルを作成しても，VMA
    の場所にデータがロードされる．
  ・実行時には毎回ダウンロード必要．
  
・(GHS) GNUの Asm("" ::: "memory")相当の命令
 ・関数単位でpragmaを使いメモリ最適化を抑制する方法はあるが，関数内で
   使用することはできない．そのため，GNUの Asm("" ::: "memory")相当の
   命令は存在しない．
  
---------------------------------------------------------------------
Tips
---------------------------------------------------------------------
FL4にて一定時間後にリセットが発生．
 ・WDTでVAC機能がONになっている．
 ・オプションバイトで設定（デバッガより設定）
 OPBT0 - フラッシュ・マスク・オプションのレジスタ0
 ・アドレス FF47000CH
 ・OPBT0の値によっては起動時からWDTが有効となる．
 ・オール0で停止する．
 OPBT0の変更
 ・デバッガでターゲットに接続
 ・デバッグ・ツールのプロパティフラッシュ・オプションタブに表示される
 ・「...」ボタンをクリックしてメニューを呼び出して変更．

---------------------------------------------------------------------
V850E2仕様(V850E2v3)
---------------------------------------------------------------------
●割込関連

割込み優先度
 値が小さいほど優先度が高い
 0が最高，15が最低優先度．
 
割込み関連レジスタ
 ・EICC : 割込み要因の取得
 ・EIWR : 割込み発生時の作業用レジスタ
 ・ISPR : 受付中の割込み
 ・PMR  : 割込み優先度マスク
 ・ISPC : 受付中の割込みのクリア
     
ベクタ
 ・割込み要因毎のベクタ．
   ・割込み毎に16bypte
         要因           : リターン命令
 0x00 : リセット       
 0x10 : FEレベルマスカブル割込み : feret
 0x20 : FEレベルノンマスカブル割込み : feret
 0x30 : システムエラー例外・周辺保護例外・タイミング監視例外 : feret
 0x40 : EIレベルソフトウェア例外 : eiret
 0x50 : EIレベルソフトウェア例外 : eiret
 0x70 : 浮動小数点演算例外       : eiret
 0x80 : EIレベルマスカブル割込み : eiret
  
FEINT/FENMI 割込み
 ・CPUシステム以外で定義される例外などで利用する．
 ・例えば，AUTOSARの時間監視などの外付けタイマなどをFEINTにつないで，
   通常のプログラムの割込み禁止許可(EIレベル)の影響を受けずに割込みを
   受け付けるようにすることができる．
 ・FENMIのほうはWatchDogなどを想定している．
 ・元々は一般アプリとは異なる緊急度の高い割り込みとして機能させることを
   想定している．
    
eiret/feret 命令
   EIレベルの例外処理からの復帰
    eiret命令
   FEレベルの例外処理からの復帰
    feret命令
   それぞれPSWのEPが0の場合に例外ルーチンの実行を終了したことを外部
   （割込みコントローラ）に伝える．
   PSWのEP(bit6)
    割込み以外の例外処理中であることを示す．このビットがセットされても
    例外要求の受け付けには影響しない．
     0 : 割込み処理中である．
     1 : 割込み以外の例外処理中
   PSWのNP(bit7)
     '0' : FEレベル例外処理中ではない．
     '1' : 多重例外の発生及び割り込みの発生を禁止する．     
・PSWのEP=0の時にeiretをすると，ISPRが割込み前に戻るが，ISPCを使って
  All 0にクリアすることで良ければ(割込みの一番外のみ実行すればよいなら
  )，eirteは必要ない．
・例外に関しては，feretはEP=1となっているので，呼び出しても呼び出さな
  くても問題ない．
・FEINT/FENMIはferetを行う必要がある．(ISPRとは別に優先度管理ビットが
  あり，クリアする必要がある ICSR.FNEとICSR.FIE)    
・PSWのEPが'1'の状態でeiret/feretを実行すれば，単にeipc/eipswまたは
  fepc/fepswをpc/pswに復帰するのみとなり，特に他に副作用はない．

    
   ・0x10 : FEレベルマスカブル割込み   feret
   ・0x20 : FEレベルノンマスカブル割込み（再開・回復不可能） feret
   ・0x30 : FE例外                                           feret
            システムエラー例外（再開・回復不可能）  
            周辺保護例外（回復不可能）  
            タイミング監視違反
            実行保護
            メモリエラー（回復不可能）  
            データ保護
            コプロセッサ例外
            予約命令例外
            ＦＥレベルソフトウェア例外
            コプロセッサ使用不可
            予約命令
            FEレベルソフトウェア例外            
            ->例外要因コード
   ・0x40 : EIレベルソフトウェア例外（Trap）eiret <- 割込みとして扱う?
            例外要因コード : 0x40 - 0x4F
   ・0x50 : EIレベルソフトウェア例外（Trap）eiret <- 割込みとして扱う?
            例外要因コード : 0x50 - 0x5F
   ・0x70 : 浮動小数点（回復不可能）        eiret <- 割込みとして扱う?
            浮動小数点例外
            例外要因コード : 0x71
   ・0x80 : EIレベルマスカブル割込み
   
●レジスタ

・システムレジスタバンク
  ・BSELにより選択 
  ・pswにアクセスする際には常にバンクを切り替えてアクセス．
  
・レジスタ別名
  r31 : lp
  r30 : ep
  r3  : sp
  r4  : gp
  r5  : tp
 
 
●命令

callt 命令
・コンパイラオプション -mdisable-callt を付けないと使用される．
・リンクも含めてコード全体を眺めた時に，最頻出ブロックに関数の出入口処
  理でのスタック退避／復帰処理がある．このため，コードサイズ縮小のため
  の共通ブロックとしてCallt命令で呼び出されるコードに変換し，出入口処
  理の圧縮を図る．  
・各命令に埋め込むよりもコード効率が良い．また，関数にしてFar 
  jump(mov+jmp=64ビット)するよりも小さい(16ビット)という点が利用価値と
  なる．    
・ただし，Callt命令はflashをアクセスするため，速度低下を招いてしまうた
  め，速度重視の最適化ではOFFとする．
  
sld/sst命令(epをベースポインタに使用する)
・sld/sstは，16ビット命令でサイズ最適化時に局所的に利用される．

---------------------------------------------------------------------
依存部の設計
---------------------------------------------------------------------
●割込処理モデル

割込み禁止
・IMR(EICn)により実現

割込み優先度
・PMR(ビットなので注意)により実現
  0～15の16段階
  0が最高優先度15が最低優先度．
  プロセッサの内部表現と外部表現の関係
    0～15,16
  -16～-1,0    
  
割込みハンドラ
・FEレベルマスカブル割込み・ノンマスカブル割込みは扱わないが，例外
  番号は割り付ける．
  ・例外番号，1,2
・EIレベルソフトウェア例外（Trap）は，例外として扱う．
  ・2種類の例外として，例外番号:4と5
・浮動小数点（回復不可能）は例外として扱う．
  ・1種類の例外として扱う,例外番号7
・FE例外を例外として扱う．例外要因コードがスパースなので，現状では
  細かい分岐は行わず，全て例外番号3の例外として扱う．

---------------------------------------------------------------------
GHS対応
---------------------------------------------------------------------
●基本

・コンパイラの判断フラグ
   __ghs__
   
・リンカスクリプト
  ほぼGNU互換だが若干異なる

・インラインアセンブラ  
  Asm("" ::: "memory"); 相当が用意されていない．  
  Asm は単にasmでよい．
  pswの設定,di,eiは組込み関数を使う．
   psw =  __GETSR()
   __SETSR(psw)
   __DI();
   __EI();
   
・アセンブラマクロ
  マクロの大枠の書き方は同じだが，引数を参照するときに\が必要ない．
  
・コマンドライン
  ccv850   

・コンパイルオプション
 現状以下のオプションで動作を確認．
  -cpu=v850e2v3               : E2V3対応
  -gcc                        : GCC互換機能
  -preprocess_assembly_files  : アセンブリファイルをプリプロセス
  -kanji=euc                  : 漢字コードの指定
  -noobj                      : アセンブリ言語ファイルを生成（不要なセ
                                クションを削除）
  -g                          : デバッグ
  -O2                         : 最適化
  
 MULTIを使うと以下のオプションも追加となる．
  -Onone
   -e 
   -no_japanese_automotive_c
   --no_exceptions
   --slash_comment
   -locatedprogram
   --no_additional_output
   -nostrip
   -Qn
   -noentry
   -O2
   -nostartfiles
   -srec
   -kanji=euc
   --asm_silent

・GNUのasm(:::"memory")相当の記述
  GHSにはGNUのasm(:::"memory")相当の記述をすることができない．そのため，
  V850_MEMORY_CHANGED は，空の関数を呼び出すことで実現する．
  
---------------------------------------------------------------------
スモールデータエリア(SDA)の有効化
---------------------------------------------------------------------
セクション名
 ・.sdata
 ・.sbss
 ・.rosdata
 ・SMALLCOMMON


--------------------------------------------------------------------------
V850/RH850のABI
--------------------------------------------------------------------------
○用語
・caller : 呼び出し元が保存(呼び出し先は保存なしに使える)
・callee : 呼び出し先が保存(使用時は保存してから)
・fixed  : 起動時の設定内容を保持

○前提
・V850は統一したABIがなくコンパイラ毎にABIを定義している
・RH850ではプロセッサでABIを定義している．

○バージョン
CX   : V2.01.00
CCRH : V2.01.00


○ABI一覧

●V850:GNU
レジスタ:      別名等                  :  扱い
R0      : ゼロ                         : fixed 
R1      : コンパイラ・アセンブラが使用 : caller 
R2      : OS予約                       : caller (-mapp-regs:ディフォルト), fixed(-mno-app-regs)
R3      : SP                           : callee 
R4      : GP                           : fixed
R5      : TP                           : caller (-mapp-regs:ディフォルト), fixed(-mno-app-regs)
R6-R9   : 関数の引数                   : caller 
R10     : 戻り値                       : caller 
R11     : 64bitの戻り値                : caller 
R12-R19 :                              : caller 
R20-R27 :                              : callee 
R28     : FP                           : callee 
R29     :                              : callee 
R30     : EP                           : caller (-mtda=0時), fixed(未定指定時) *
R31     : リンクポインタ               : caller

SC3では，-mno-app-regsを指定．


●V850:GHS(V5)
レジスタ:      別名等                  :  扱い
R0      : ゼロ                         : fixed
R1      : コンパイラ・アセンブラが使用 : caller 
R2      : OS予約                       : caller or fixed(-reserve_r2)
R3      : SP                           : callee 
R4      : GP                           : fixed
R5      : TP(ROSDAベース)              : caller or fixed
R6-R9   : 関数の引数                   : caller 
R10     : 戻り値                       : caller 
R11     : 64bitの戻り値                : caller 
R12-R19 :                              : caller 
R20-R27 :                              : callee 
R28     : FP                           : callee  
R29     :                              : callee 
R30     : EP                           : caller(-notda)，or fixed *1
R31     : リンクポインタ               : caller 

-notdaはディフォルトで有効．

●V850:CX
レジスタ:      別名等                  :  扱い
R0      : ゼロ                         : fixed
R1      : コンパイラ・アセンブラが使用 : caller 
R2      : OS予約                       : fixed
R3      : SP                           : callee 
R4      : GP                           : fixed
R5      : TP                           : fixed*1 
R6-R9   : 関数の引数                   : caller 
R10     : 戻り値                       : caller 
R11     : 64bitの戻り値                : caller 
R12-R19 :                              : caller 
R20-R27 :                              : callee 
R28     : FP                           : callee  
R29     :                              : callee 
R30     : EP                           : fixed*2
R31     : リンクポインタ               : caller 

*1 関数のアドレスを動的に(プログラム中で)取得しない場合は使用しない．
*2 該当セクションがない場合は使用しない．

●RH850(CCRH)
レジスタ:      別名等                  :    扱い
R0      : ゼロ                         : fixed
R1      : コンパイラ・アセンブラが使用 : caller 
R2      : OS予約                       : caller or fixed
R3      : SP                           : callee 
R4      : GP                           : fixed
R5      : TP                           : caller or fixed*1
R6-R9   : 関数の引数                   : caller 
R10     : 戻り値                       : caller 
R11     : 64bitの戻り値                : caller 
R12-R19 :                              : caller 
R20-R27 :                              : callee 
R28     : FP                           : callee  
R29     :                              : callee 
R30     : EP                           : callee or fixed(-Xep=fix)
R31     : リンクポインタ               : caller 

*1 CCRHでは現状fixedはサポートしていない

--------------------------------------------------------------------------
各コンパイラでのコード共有のためのレジスタの扱い
--------------------------------------------------------------------------
各コンパイラ,V850/RH850で扱いが異なるレジスタは次の通りである．
 
  ・R2
  ・R5(TP)
  ・R30(EP)

それぞれのレジスタの扱いについて次のようにする．

●R2
システム予約としてOS内で使用する(割込み禁止時にアセンブラ内で
テンポラリレジスタとして使用する)．
そのため，ディスパッチャや割込みのエントリでは保存しない．
理由
SC3で必要なため．
各コンパイラでfixedの扱いに可能．
・コンパイルオプション指定
  ・GCC    : -mno-app-regs
  ・GHS(V) : -reserve_r2
  ・CX     : 指定必要なし
  ・CCRH   : -Xreserve_r2

 
●R5(TP)
アセンブラ内では使用しない．割込みで保存する．
理由
CCRHでcallerであるため，割込み出入口で保存復帰の必要がある．
ifdefを入れると可読性が下がるため一律保存する．
一方，他のコンパイラではfixedであるため，アセンブラ内で変更で
きない．CCRXがfixedをサポートした際にはfixedとして扱う． 
 
  各コンパイラのABI 
  ・GCC    : -mno-app-regs でR2と共にコンパイラは使用しない
  ・GHS(V) : fixed (ROSDAベース)
  ・CX     : fixed
  ・CCRH   : caller
 
●R30(EP)
  割込みの出入口で保存復帰する．
  ディスパッチャでも保存復帰する．
  CX/CCRHでのfixedの使用はサポートしない．
理由
  GCC/GHSではcallerであるため割込みの出入口で保存復帰する必要がある．
  ifdefを入れると可読性が下がるため一律保存する．
  CCRHではcaleeであるためディスパッチャで保存復帰する必要がある．
  epはアセンブラの命令長を短くできるため，アセンブラ内で使用しているた
  めCCRHでも割込みの出入口で保存する．
  ・GCC    : -mtda=0でコンパイラが使用する?
  ・GHS(V) : -notdaでcaller として扱う
  ・CX     : fixed
  ・CCRH   : fixed or calee
 
 
---------------------------------------------------------------------
割込み/ディスパッチャでのレジスタの保存・復帰
---------------------------------------------------------------------
○割込み

・該当箇所
_interrupt と _fe_exception_entry と _ei_exception_entry によるレジスタの保存．
  ret_exc_2 と ei_ret_exc_2 と ret_int_1 でのレジスタの復帰について

・保存・復帰レジスタ
callerレジスタは保存する．

  r1, r6-r19, r31
 
上記の検討よりr30(ep)も保存する．

CCRHの場合はr5(tp)も保存する必要があるが，ifdefを入れると可読性が下が
るため一律保存する．

以上より，保存するレジスタは次の通りである．

r1, r5(tp),r6-r19, r30(ep), r31


○ディスパッチャ

・保存・復帰レジスタ
calleeレジスタは保存する．

r20-r27,r28,r29

r31(lp)はリターンのために保存する

CCRHではr30(ep)も保存する．ifdefを入れると可読性が下が
るため一律保存する．

以上より，保存するレジスタは次の通りである．

r20-r27,r28,r29,r30(ep),r31(lp)


以上．
