ASP kernel 1.3.1-SH7144依存部(CQsh2_gcc)

TOPPERS/ASP kernelのSH7144への移植~その3

日記タイトルとしてはコッチが正解.wiki titleにも生ってしまうので,タイトル名はソレらしいものへ修正.

[TOPPERS/ASP] SH7144向けASP kernel 1.3.1対応ターゲット依存部

表題のモノをリリースいたします.個別パッケージのみのリリースとさせていただきます.

当方ではROM化した環境でのみ確認しております.内蔵RAMだけでの動作も未確認です.
RAM上にコードを置いた場合,微微小時間待ちのチューニングができておりませんので,実時間に対して待ちすぎてしまうことが予想されます.

ターゲット略称CQsh2_gcc
target H/WCQ出版,Interface誌 2006年 6月号付録 SH7144ボード(※1)
ターゲット非依存部asp-1.3.2
他必要な個別リリース物asp_arch_sh12a_gcc-1.3.1.tar.gz(※2)
言語処理系binutils-2.18, GCC 4.3.2, newlib-1.16.0, (gmp-4.2.3, mpfr-2.3.2)

※1ただし,付録基板は以下の改修済みであることを条件とする.

  • DBGMD端子のPullDown
  • SCIF1のレベル変換後のPullUpパターンカット
  • 電源レギュレータ入力コンデンサ増強
  • 外付け高速SRAM/ロジック追加

※2SH1/2Aアーキテクチャ・GCC依存部パッケージ(released at 2008-05-13)


実作業

メモとして不足があるとは思いますが,076077とが対象となります.ご参考まで.

2008/10/29(水)TOPPERS/ASP kernelのSH7144への移植~その2

[TOPPERS/ASP]ポーティング作業メモ

ある程度前提条件を用意しないと作りこめない((ざっと修正しようとしたけれども,target依存の仕様定義なしでは無理だったので,追記.))ので,付録についている使える部分にあわせて実装する.

  • UART
    kernelでSCIF1を使う.TX1/RX1が生きているので,これをログ吐き出しようにする.通常タスクからも,標準出力として使える*1

*1 : codeを呼んでいるときにコメントで確認.

target依存部

asp/target/cq7144/を作成し,asp/target/apsh2a_gccのファイルをコピーする.
target_user.txt は,逐次修正していく.port.txtに従い,推奨されている情報を記載する(ように気をつける).
また,各ファイルのヘッダ部分については,確認が必要だろう.

  • Copyright表示をどうするか?
  • CVSの '$Id:'表記を削ってよいか?*2

cqsh2.h

  • シンボル名を変更する.(TOPPERS_APSH2A_H → TOPPERS_CQSH2_H)
  • include fileを変更する.("sh12a_gcc/sh7211.h"→"sh12a_gcc/sh7144.h")
  • 動作クロックを変更する

Makefile.target

  • シンボル変更
    • BOARD = cqsh2
    • PRC_ARCH = SH2
  • アドレス変更
    • DATA_START_ADDRESS = 0x00400000 【動作検証未】
    • TEXT_START_ADDRESS = 0x00000000 【動作検証未】
    • DEFAULT_STK_TOP = 0x00000000 【動作検証未】

"DEFAULT_STK_TOP"は,R15(SP)にセットしたいアドレスをおいておくと良い.gccがgenerateしてくれるスタック操作は "mov.l hoge, @-r15"だったので,ケツからつかうならゼロで良さそう.


E_PACKAGE

  • asp_apsh2a_gcc → asp_cqsh2_gcc

MANIFEST

  • 名前だけ変更?ファイルの過不足を確認.実際の動きを見て修正要【未】

target.tf

  • sh7211.tf → sh7211.tf

target_cfg1_out.h

(修正不要)


target_check.tf

(修正不要)


target_config.c

target_initialize()にて,依存部の初期化処理を入れる.主にPFC設定となるだろう.
prc_initialize()でどの程度の初期化をしているのか,気にしておくこと.
★ペリフェラルの初期化がどんどん後ろに行くなぁ.でも,最低限度の初期化だけにとどめるべきだろうな...


target_config.h

以下のシンボルに注意.SCIFのIDとは相関が無い気がする.【未検証】

 *  ターゲット依存の文字出力に使用するポートの定義
#define TARGET_PUTC_PORTID 2

DEFAULT_ISTKSZの変更.メモリ容量を見て調整する.【要調整】→とりあえず3kしかないので1kにする.

 *  微少時間待ちのための定義(本来はSILのターゲット依存部)
#define SIL_DLY_TIM1     75
#define SIL_DLY_TIM2     21

これらも使用している場所で,どの程度の時間を期待しているか,を確認して修正すること.【要】
>asp/doc/porting.txt (870,1): 
> (4-2-1) void sil_dly_nse(ulong_t dlytim)
仕様について記述がある.2つある理由も記載されている.
SH7144においては,cacheがないため,値のload/codeのfetchに時間を要するため,
簡単には導出できない.
内蔵ROM/内蔵RAM/BSC配下のRAMにコード/データをおく場合によって,値が変わるだろう.
ROM化とそれ以外,の例のままおいておくので,テストコードで実測してつめていこう.【要調整】
参考:[http://www.apnet.co.jp/toppers/cbbs/cbbs.cgi?mode=res&namber=65&page=&no=0:TOPPERS掲示板~sil_dly_nse()に与えるパラメータについて]
>||
算出したステート数から以下の条件で処理時間を計算します。
  1ステート = 1クロック
  CPU周波数 = 49.152MHz
  ・1つ目の処理時間
    7 / 49152000 * 1000000000 = 142.415 [ns]
  ・2つ目の処理時間
    10 / 49152000 * 1000000000 = 203.450 [ns]

load直後のr4を演算に使っているので, state表どおりにはならない. memoryアクセスのwaitもここでは考慮されていないように見える.実測から測定するのが妥当だろう...


target_kernel.h

(修正不要)


target_rename.def

(修正不要)


target_rename.h

(修正不要)


target_serial.c

SCIFのIDを固めてから修正する.あまりいじるところは無いだろう【要】


target_serial.cfg

kernel configurationファイル.静的な割込みハンドラ登録,初期化関数登録を行う.
INTNOに番号が振られていないのが気になる→target_serial.hで,定義している.


target_serial.h

使用するSCIFに依存したベクタ値や割込み優先度の値を定義する.割込みレベルを含めたシステム設計が必要.問題になるまで放置かな.-4でok.(上から4番目/16段階)

コンパイル時に問題になった(ぉ


target_sil.h

(修正不要)注:リトルエンディアンで使用する場合は,シンボル定義を変更すること.


target_stddef.h

  • TOPPERS_APSH2A → TOPPERS_CQSH2
  • 以下の実装は見送る,か,自爆リセットかな?
     *  アサーションの失敗時の実行中断処理(T.B.D)
    TOPPERS_assert_abort(void)
    

target_support.S

_hardware_init_hook:

少なくともバスコントローラ・クロックまわりのペリフェラル初期化処理はココに記述する.ひとまず下記の設定とした.CS0は本来不要だが,FPGAを接続する予定なので有効にしておき,バス衝突が生じないようにする対策である.

  • module standbyは,全部を解除する.
  • BSCは外部空間を有効とする.(必要最小限=SRAM領域 に削るべきだが,wait多めで初っ端は作る)
  • PortA,B,C,D,Eのみ HW初期値でも初期化します. Fは何も触りません...
  • PFCもBSCを使える程度の設定までとする.SCIFxの設定は,target_initialize()内で良いだろう.

→ここではまった.こうは書いたものの,実際にはどちらでも実装せずに抜け落ちていた. SH7144のデータシートを見る限りでは,function設定を行えばIO directionも強制的に切り替わるロジックになっている.


target_syssvc.h

割込み番号を追加(たぶん使わないだろうけれども)

#define SCIF3_RXI_INTNO   SCIF3_RXI_VECTOR
#define SCIF3_TXI_INTNO   SCIF3_TXI_VECTOR

SCIFサポート数を3にした.CQはSCIF2を使用しており,0,1,2の順に定義しているため.管理番号とSCIFxとの対応を変えれば,必要最小限に抑えることができるでしょう.

#define TNUM_SIOP 3

target_test.h

(修正不要)
アドレスエラー生成は,適当な基数アドレスへintアクセスをさせることで行っている.右辺式のみなのだが,消えないのだろうか.(volatile変数として扱ってはいるけれど).


target_timer.cfg

(修正不要)


target_timer.h

(修正不要)
CMT.CMCSR.CKS = 0 (8分周)

target_unrename.h

(修正不要)


target_user.txt

今回の修正終了後に,書式にあわせて修正する【未】


*2 : (株)ヴィッツ様の依存部コードでは削られていることを確認.

architecture依存部

asp/arch/sh12a_gcc/ 配下

  • "sh7144.h"を作成する.
  • "sh2_config.h"を作成する.
  • "sh7144_config.h"を作成する
  • "sh7144.tf"を作成する.

sh7144.h

  • ベクタテーブルのシンボルを定義する.
    命名はHWMのvector表に従った
  • 内部制御レジスタのシンボルを定義する.

SH2Aとは少しつくりが異なるのか,シンボル名が異なるだけなのか不明だが,sh2a_config.hでは所望の動作にならない.
SH7144.hで定義するICRのシンボル名をマニュアルと異なる名称とすれば,エッヂ検出設定を x_config_intatr()で行うことは可能になるけれども,美しくない.

コンパイル時に不整合が発覚.

  • prc_timer.hから,CMI0_VECTORを参照している.
    ベクタテーブル名称は,もとのものにあわせておく必要があるぽい.
    汚いが下記のとおり追加した.
    #define CMI0_VECTOR  CMT_CMI0_VECTOR		/* for prc_timer.h */
    #define CMI1_VECTOR  CMT_CMI1_VECTOR		/* for prc_timer.h */
    

sh7144_config.h

  • USE_BANKED_REGをコメントアウト.SH2にはレジスタバンク機能は無い...
  • init_irc()の実装を修正.
    割込みレベルを最低にセット,HW初期値に戻して,要因はクリアしておく.

sh2_config.h

  • edge検出設定(x_config_intatr)のコード修正.

レベルセンスと両エッヂにも対応.(勝手に拡張)
TA_POSEDGE,TA_NEGEDGE を用いて,両方の論理和を渡すと両エッヂ,どちらのビットもたっていなければ,レベルセンスとなる.

sh7144.tf

オリジナルを参考にして,割込みベクタ・priorityの縛りを記述する.*.tfファイルの位置づけや仕様,コンフィギュレータとの絡みについて調査を要す.vectorコードが肥大化しているので,コンフィギュレータに対してコードを自動生成する部分でもあることは確からしい.【要資料集め・調査】

prc_config.h

i_begin_int()にて,SH2A依存コードが記述されている.関数の移動もしくは,[bf:sh[12[A]?]_config.h]でのシンボル定義による切り替えを行う必要があるだろう.
今回はオリジナルを尊重し*3,シンボルによる切り替えで実装する.


*3 : 依存部として株分けしたのだから,消しても良いか?

pdic配下のSerial Driver

SH2のSCIとSH2のSCIFとはモノが異なる.そもそも内蔵ペリフェラルのSIOドライバであり,target依存と考える.
ただし,SH2として共通であればPDIC配下に戻すことも考慮する.
CQ7144としてportingする場合においては,ベースとして拝借し,target依存部へと移動する.

なお,includeしているのは,target_serial.[ch]と,target_config.hである.


sh_scif.c/sh_scif.h

→リリース時には,pdicへ戻すことにする.
内蔵デバイスなので,arch依存と考えるのが妥当な気もしますけれどね...



debug

一発で動かなかった.改変した箇所の詳細を反映させる必要があるが,ガッツリと作業にハマってしまい,履歴が残っていない….
debug時にもソースコードを改変/修正したので,更新情報もあわせて出したいと思う.


[ToDo]

  • コード整形時に差分を取りながらメモを追記する.
  • release状態も検討しながら修正する.
  • make PACKAGEを試して,asp kernelすっぴんでのmake/build/実機sample動作確認をとる.
    → リリース前確認用のログを取得する.

2008/10/29(水)TOPPERS/ASP kernelのSH7144への移植~その1

[TOPPERS/ASP]プロセッサ依存部の資料

大枠

ポーティング資料の大元は,以下のファイル.

asp/doc/porting.txt
  TOPPERS/ASPカーネル
  ターゲット依存部 ポーティングガイド
  対応バージョン: Release 1.3.2 (最終更新: 2008年8月3日)

sh12a_gcc/prc_user.txt より

@SH12Aプロセッサ依存部(asp-1.3.1対応)Last Modified: '08/05/12 
SH13A依存部は,SH1/2/2Aをターゲットとしている.SH1/2/2Aにはいくつかの
バリエーションが存在し,バリエーションによっては,割込み関連のレジスタ

誤植もあるが,SH2対応のarchitecture対応と明示されている.(方針) (方針)SH7144対応は,コレに対するpatchという形で作成する

SH2A(7211)とSH2(7144F)とでは,SCIそのものの構成が変わっている.SCIのレジスタアドレス・制御レジスタの構造はもちろん,SH2AのほうがFIFOを積んでいて快適そうだ.
流用できないことが自明になったが,本家が pdic/sh/sh_scifとしているため,当初はSCIFのコードをtarget依存部においていた.しかしながら,秋月のSH7145へのポーティング((私がやるのではなく,第三者が,と考えています.同時に複数触らない&買い増すならSH2A以上とか..))を視野に入れると,pdicなのかな?と.ただ,pdicて外付けICのためのように思えたりもするのだけれど….

ディレクトリ構成の詳しいシキタリやドキュメント記述ルールも明確化しないと,結構ばらついているように思います.
いざリリースしようと思っても,どれにあわせるべきかで悩んでしまった.

RENESASのサイトでダウンロードできるヘッダファイル集*1をパクってくると良い感じだろうか.

ToDo?

資料より,何をすべきしたかをまとめる.もともとポーティングについて纏まって記述されているが,具体的作業を併記することで,別プロセッサへの移植の助けになることを期待.

ファイルの新規作成
  • asp/arch/sh12a_gcc/配下
    サポートするプロセッサの型番を(sh7xxx)とする.
    • テンプレートファイル(sh7xxx.tf)
    • カーネル実装のターゲット依存の定義(sh7xxx_config.h)
    • ハードウェア資源のヘッダーファイル(sh7xxx.h)
  • asp/target/cq7144/配下(ディレクトリも新規作成)
    基本は既存のtargetファイルを元に作成する.今回はapsh2a_gccをベースにする.
    {asp/doc/porting.txt::10.1 ターゲット依存部のファイル一覧に詳しく書かれている….
    • E_PACKAGE
      asp/doc/porting.txt :: 9.2 パッケージ記述ファイル/option
    • MANIFEST
      asp/doc/porting.txt :: 9.2 パッケージ記述ファイル/option.個別パッケージ作成用ファイル.
    • Makefile.target
    • cqsh2.h
    • target.tf
    • target_cfg1_out.h
    • target_check.tf
    • target_config.c
    • target_config.h
    • target_kernel.h
    • target_rename.def
    • target_rename.h
    • target_serial.c
    • target_serial.cfg
    • target_serial.h
    • target_sil.h
    • target_stddef.h
    • target_support.S
    • target_syssvc.h
    • target_test.h
    • target_timer.cfg
    • target_timer.h
    • target_unrename.h
    • target_user.txt
      asp/doc/porting.txt :: 9.1 ドキュメントにて要求されている.記述内容もtarget設定や環境など該当ドキュメントに記載されている.
    • test_log.txt
      sampleプログラムのconsole出力結果(log.

以下,さらに抽出.

  • 不思議ファイル
    個別パッケージ生成時のコマンド例
      % utils/makerelease arch/arm_gcc/MANIFEST
    簡易パッケージ生成時のコマンド例
      % utils/makerelease target/at91skyeye_gcc/E_PACKAGE
    

[bf:MANIFEST}や*PACKAGEで,リリース用のアーカイブを作る際に内包させるファイル等を明記する,ということのようです.

  • その他のファイルが必要な場合は,プロセッサの型番を先頭に着けたファイルを作成,

ターゲット依存部からインクルードすればよい.


割込み優先度設定

prc_config.c :: const IPR_INFO ipr_info_tbl[] を IPR_INFO_TBL_DATA で初期化する.依存部(shxxx_config.h)にて,IPR_INFO_TBL_DATAを含めた割込み関連のシンボルを定義する.割込みベクタのMIN.値をindex=0として,該当ベクタの優先度設定のためのIPRレジスタのアドレスをaddressメンバへ放り込む.resere/空きもあるので,そこは 0を代入しておくこと.

typedef struct {
    /* 割込み優先順設定レジスタのアドレス */
    uint32_t address; 
    /* オフセット */
    uint32_t  offset;
} IPR_INFO;

メモ

tareget依存部のmakefile(Makefile.target)に,以下のシンボルが存在する.
これによりプロセッサ依存部のファイルを選択するようになった.JSPではプロセッサとターゲットを個別に指定する必要があった*2と思う.

BOARD = cqsh2a
PRC   = sh12a
TOOL  = gcc

*1 : include_sh_080130.zip

*2 : ほとんど触らずに終わったので怪しい

2008/10/05(日)[GCC] SH2環境不具合疑惑(自己完結)

前ふり

066にて,SH-ELF-GCC環境を準備した.
ところが,コレには不具合がある模様で,buildできないと思われる.記事作成中にふと思い立って解決した.とりあえず経緯だけでも残しておく.outputとして,TOPPERS環境への反映を行うことにする.

問題点

TOPPERSのconfigureにより,targetサンプルプログラムを作る.のちほどまとめ記事を作成するが,CQ-SH7144向けのポーティングをしたものだ.
コンパイルがとおることまでは確認できたが,下記のとおりリンクエラーが生じる.

sample1.o: In function `main_task':
/home/XXX/asp/app02/sample1.c:352: undefined reference to `___udivsi3_i4i'
log_output.o: In function `convert':
/home/XXX/asp/app02/../library/log_output.c:65: undefined reference to `___udivsi3_i4i'
collect2: ld returned 1 exit status
make: *** [asp.exe] Error 1

KPITのWEB pageでは,sh-elf-ldへの引数で,-L -lオプションの記述がまずい場合に起こりえる旨,記述があった.しかし,今回はそうではなさそうだ.

釈迦に説法だと思うが,errorの意味としては,リンク時にlog_output.cの65行目で___udivsi3_i4iというラベルが見当たらないよ?という意味である.


解決手段

リンク時,リンカに対して,-nostdlibを指定している.これは,gccの和訳(勝手にリンク)によると,以下のとおり.

リンク時に標準システム・スタートアップ・ファイルや標準システム・ライブラリを使用しません。
スタートアップ・ファイルは一切リンカに渡されません。
指定されたライブラリだけがリンカに渡されます。

スタートアップルーチン等は,TOPPERSのarchitecture依存部で実装するため,gccの標準ライブラリは不要なためである.

そこで,-m2でSH2を指定したときだけに問題が見えていたため,以下のディレクトリにあるobjectを全て逆アセンブルしてみる.

usr/lib/gcc/sh-elf/4.3.2/m2
% sh-elf-objdump -Dtr foo.[ao] > foo.[ao].txt

便宜上,ワイルドカード表示にしてあるが,実際にはテキストエディタでエイヤと作成した.find --exec ...が正等かもしれないが,あんまり覚えてないので...
出力させたファイルをgrepしてみると,___udivsi3_i4iが見つかる.

libgcc-Os-4-200.a

居た・・・コイツか.確かに,リンク指定は-lgccとしか指定していない.とりあえず適当なところに下記の行を追加して試してみる.

LIBS := $(LIBS)  -lgcc-Os-4-200

なんの問題もなくbuild完了./(^o^)\ナンテコッタイ

GCC4.3.2環境でのみ生じる問題なのだろうか.TOPPERS/ASP kernelのSH12A architectureの動作保障がSH2でしか存在していないためなのだろうか.
ぶっちゃけ,cygwin環境でもう一度gccのフルビルドはしたくない...

それどころか,今回のポーティングやGCCの一部を追いかけることにより,HEW環境の立ち上げが最適解であるように感じられた.
gccはその汎用性が優先されている感を受ける.最適化範囲も,それほどglobalでは無いように思えるのだ.ADS/RVDSのようにレジスタ直行性も視野に入れてアサイン・命令の入れ替えをしてくれない(と思う).HEWは,メーカ謹製コンパイラを使っているのだから,そのアタリの最適化もしてくれているハズだろう(未確認).

おかげさまで,sh1/sh2/sh3での除算比較ができましたわ.とりあえずSH3未満だと除算命令やシフト命令のあたりで結構きつい制約があるように見受けました.また,SH2以下だと,汎用レジスタバンクが存在しないため,割り込み応答性能が劣るという問題を認識しました.

う~ん,結局動作クロックを挙げて,外部との境界にキャッシュを置くしかないんだろうな・・・.SH4ボードとか買ったほうが早そうだな.ALPHAの板が4万以下だから安いんだよな.
安いといっても,玄人箱が2台も買えるのだが('A`


足掛け三日ほど悩んでいました.下らんことでハマるハマる...

2008/09/27(土)TOPPERS/ASP kernel環境

前置き

先日,sh-elf-gcc環境をbuild/installした.
今回は,TOPPERS/ASP kernelを導入したいと思う.OSEK,JSP kernelもあるが,新しい物好きということでASP kernelを持ってくる.
以後,SH系の開発環境は,基本的にcygwin環境上で行うこととする.



[TOPPERS]ASP kernelを使ってみる

ファイルの展開

まず,/home/xxxx/ 以下(どこでもいい)にkernelのアーカイブを展開する.

$ cd ~
$ zcat /cygdrive/c/Workspace/asp-1.3.2.tar.gz  | tar x
$ zcat /cygdrive/c/Workspace/asp_arch_sh12a_gcc-1.3.1.tar.gz | tar x

順序が前後するが,sh12a環境においては,hwe環境に入っている,asp/pdic/sh以下のファイルを同名のディレクトリに展開しておく必要がある.
architecture依存部として,SH向けは以下の2種類がある.今回はgccをtargetとしたので,gccだけを解凍していた.ところが,asp/pdic/sh 以下が, HEWにしか存在していない.

  • SH1/2Aアーキテクチャ・GCC依存部パッケージ
    asp_arch_sh12a_gcc-1.3.1.tar.gz
  • SH1/2Aアーキテクチャ・HEW依存部パッケージ
    asp_arch_sh12a_hew-1.3.1.lzh

ということで,lzhを解凍して,c/hの改行コードをLFのみに変えて保存し,pdic/sh/へ移動させた.


kernel configuratorを作る.

$ cd asp/cfg
$ make depend
# make

ただし,C++のlibraryであるところのboostが必要となる.ver.1.33での構築が実績のある環境だ.
ただし,cygwin環境では決めウチされる模様.Makefileの冒頭でこうなっている.

ifndef BOOST_DIR
	ifndef BOOST_VERSION
		BOOST_VERSION = 1_33_1
	endif
	ifeq ($(OSTYPE), msys)
		BOOST_DIR = /mingw/include/boost-$(BOOST_VERSION)
	else
		ifeq ($(shell echo $$OSTYPE), cygwin)
			BOOST_DIR = /usr/include/boost-$(BOOST_VERSION)
		else
			BOOST_DIR = /usr/local/include/boost-$(BOOST_VERSION)
		endif
	endif
endif

自力でboostをmake/installしてみた(ver.1.36)が,引数をなにも指定せずに行ったため,install prefixは/usr/local/以下になってしまった.作られたライブラリ等,微妙にまずかったようで,リンクエラーとなった...orz
参考まで,boostディレクトリの指定方法を記録しておきます.

% make depend "BOOST_DIR=/usr/local/include/boost-1_36"
% make "BOOST_DIR=/usr/local/include/boost-1_36"

で,結局cygwinのsetupプログラムで更新をして終了.既存のcygwinに対しても,setupで更新ができる模様です.便利ですな...


sampleプログラムを作る

kernel環境には,サンプルコードもmakeで作れるようなものが用意されている.JSP kernelのときは,ターゲットアーキテクチャとを指定する必要があるのに対して,ASP kernelではターゲットのみでよくなっている.
そりゃまぁ,ターゲット同じでアーキテクチャが異なることは考えづらいですしね...
今回のsh12a-gcc環境に含まれているアルファプロジェクトのターゲットソフトを作ってみましょう.

$ cd ~/asp
$ mkdir app01
$ cd app01
$ ../configure -T apsh2a_gcc -D ..
$ make depend
$ make

これで,asp.(exe|srec|syms)のあたりが生成されます.コードができたか確認したいので,ちょっと見てみましょう

$ sh-elf-objdump -D asp.exe

ダーッと逆アセンブルコードが出てきますナ.



次回予告

次は,CQ7144としてターゲット環境の構築を進めていきます.
ささっとググったところ出てこなかったので,作らざるを得ないというところですね.無念...