TOPPERS
TMS320VC5416 USB DSKボート
FreeScale  JMBadgeボート/Coldfire-V1

ARM
 Coretex-M4

 秋月H8− 3069USBボート
このボードは他の 3069ボートと違い秋月で開発したものでは無いらしい。
クロックも25MHZでTOPPERSで配布している簡易モニターでは動かない。
toppers 簡 易モニターのちょっとした改造
を参考に修正してほしい。
CygwinでGDBのコンパイルに失敗したので開発環境は
Cygwin
GCC
簡易モニター
となった

環境構築
ソースを/home/xx/jsp などに展開
ここを参照してbinutils、 gcc(ELF版)を生成します。
簡易モニターを生成
簡易モニターH8 − 3069USBボートに書き込む
 設定SWの1/0が他の 3069ボートと違う以外問題なし
 
簡易モニターをGCC3.4.x でコンパイル
 なぜかシリアル出力で文字化け、この問題はSH2などでも出ているらしくGCC2.9xか4.0xにするしかないようだ。

Kernel構築
ここを参照して
いくつかエラーが出るがcoffをELF版としたことによるエラー

Ti TMS320VC5416 USB DSK
ボート
  Toppers_JSP_DSP-B.docも見てください
 
Tiの固定小数点DSPの開発KITでUSB で接続、JTAGデバッガが使用できる。
 なぜかソースレベルのBPが使えないが、デバッガで追跡できることは大きい。(-gがついていなかった)
 -gはProject-FileSpecific optoon-compilerでGenerate Debug InfoからFullsimbolic Debugを設定することでOK

 TMS320VC5402 DSP スタータ・キットへの移植実績があるので、これよりの変更で考える。
 
TMS320C5402<−>TMS320C5416
  32KB          256 KB
 
  の違いだけのようだ、メモリーマップも違うのと5416では64KW以上のプログラムエリアがあるのでFarCallを使わないと真価が発揮できない。 5402版はこの点を些少しているのでデスパッチャーを変更する。
 .Cmdファイルもメモリーマップを変更する。

*.SのソースファイルのBD,CALLなどは下記の命令に変える
- FB[D] ? ファー ブランチ
- FBACC[D] ?アキュムレータAまたはアキュムレータBの値によって指定される位置へのファー ブランチ
- FCALA[D] ?アキュムレータAまたはアキュムレータBの値によって指定される位置へのファー コール
- FCALL[D] ? ファー コール
- FRET[D] ? ファー リターン
- FRETE[D] ? 割り込みのイネーブルをともなうファー リターン


 ボードレベルで見ると、TMS320VC5416 USB DSKにはシリアルがないのでRTDXを使いJTAG経由で実現する、シリ アルは実機では使う機会が少ないので、また必要によりMCBSPを使うことでHOSTCPUと通信すればいいわけである。
 
Ti/exampleを参考にCmdファイルを変更して
LINK/ ロードOK、ターゲットCPUのメモリーMAPに合わないとロードでエラーが出るのでチェックは容易だ。
 さらにシリアル関連のファイルをプロジェクトから削除し、LINKエラーの箇所をコメントにする。

これでデバック可能に成ったが、意外と思ったようにいかない、思わぬところでカーネル解析に突入。
 メーリングリストに問い合わせても良いのだが、マニュアル類、過去ログをまだ読み切っていないので遠慮せざるおえない、この辺がFreeSoftを使う とつらいところだ。
FreeSoftを使う場合デバック環境が重要だ

カーネル解析
 JSP カーネル・ユーザーズ・マニュアル

 を参考に、Cソースファイルは以下の所だけ見れば良い。
kernel/ カーネルソースファイル
 
config/ ターゲット依存部
 
tms320c54x/ TMS320C54x プロセッサ依存ファイル
  
c5402dsk/ TMS320VC5402 DSK システム依存ファイル
 
tools/ 開発環境依存ディレクトリ
  C5402DSK/ TMS320VC5402 DSK用のプロジェクトファイル
まず
doc/ ドキュメントのターゲットの.txtを読む

cpu_support.S
 
デスパッチのプロセッサ依存部分、タスクのコトロールはkernel/taskxx.cなど
 ここのCall/BlanchをFARに変更、単純に頭に゛F゛をつけてもだめな命令もある
 アセンブラで書く時は遅延命令に注意する、読むときも同様で遅延命令を知っていないと頭が混乱してくる。

デスパッチがうまくないので
cpu_support.S辺りからデバッガで追跡
TCB構造体を持ったいくつかの構造体を使ってタスクの制御をしている。
task.c startup.c cpu_config.c の関数がこの構造体をアクセスする。

ここが呼ばれないためタイマーが動かずCPUは割込み待ちで停止
void
timer_initialize(VP_INT exinf)
さらに、割り込み処理に問題
interrupt_initialize()が呼ばれないらしい。
なんとか動いた。

**アプリケーションを動かす
rtdxを使うsampleを作る
tone.cをtoppersで動かす
Tiのサンプルtoneからコピー

BSLを使わないとだめなようだ
MCBSP_start()追加 
DSK5416_init()で飛ぶ -ldsk5416.lib −> -ldsk5416f.lib(Farのライブラリー)にした

*toneの改良
 間引きで周波数を変えてみる、ディッフSWの設定で2から10倍の周波数を出す。
元を48*5段階としたので
1/2
1/3 80
1/4
1/5 48
1/6 40
1/7 最小公倍数40303.2 40303まで回す/少しずつごまかす
1/8 30
1/9
1/10 24

少しずつごまかす
一度計算し、過不足を四捨五入時に切り捨て/繰上げする

フリースケール
FreeScale
 JMBadgeボード
/Coldfire-V1
 まずコンフイギュレータでターゲット仕様に合わせてコンフィグをする
TOPPERS_JSP_On_JM128BadgeBoard_User_Manual_RevC_JPN.pdf
  この例をTOPPERS/JSP カーネルと共にコンパイルする前に、jsp/cfg ディレクトリにあ
る「cfg.exe」というオリジナルGNU ツールを使用してカーネルと例との構成を行い、カ
ーネルとアプリケーションとのコンパイル用のkernel_cfg.c とkernel_id.h2つのファイル
を生成することが必要となります。

生成コマンド:
cfg\cfg.exe sample.cfg -kernel_id kernel_id.h -kernel_cfg kernel_cfg.c

  シリアル初期化でasm_exception_handlerに飛ぶ
 割り込みは SP_INITのみ定義されている
MCF52235    UART with DMA
MCF51JM128 S08SCIV4 8Bitと同じ機能

TWRLL64_Quick_Start/CODE/AS1.cから
 void AS1_Init(void)
 byte AS1_SendChar(AS1_TComData Chr)
をコピーする

Clockも違う
JMはMultipurpose Clock Generator (S08MCGV3)であった
 TWRLL64_Quick_Start/ からコピーする

makeoffset.cの取り扱い
とあるTOPPERS開発 者の日記

 makeoffset.sが作られるらしい、これを処理してoffset.hを作っている
つまり
makeoffset.c

処理系に対応する何らかの処理

offset.h
 ということをすれば良い。
 と言うように思うが、面倒なのがビット操作でこれはコンパイラ依存になってしまいます。
 この処理をするスクリプトか無かったことと、さらに開発環境を変えるとスクリプトを作り直す必要が出るかもしれません。
 そこでビット操作を”C"にまかせ、下記のようにすると処理は少しかかるがポータビリティは良くなると考えているところてす。

cpu_support.Sを”C"に変更
cpu_support.c

void kernel_call_texrtn_chk(void){
  if(runtsk->enatex){
    kernel_call_texrtn();/*   タスク例外処理ルーチンの呼出し */
  }
}

asm void _kernel_dispatch(void){
---
---
        move.l _kernel_runtsk, a0               /* A0 を _runtsk に */
        add.l   TCB_texptn,a0
        tst.l (a0)              /* texptn が 0 でなければ           */
        bne _kernel_call_texrtn_chk         /*   タスク例外処理ルーチンの呼出し */
dispatch_r_1:

  offset.hはmakeoffset.cのマクロを展開し、下記のようにするとコンパイラ依存は無いようなのでスクリプトを作らずに実装できそうで す。

offset.h
int     TCB_texptn=&(((TCB *) 0)->texptn);
int     TCB_msp=&(((TCB *) 0)->tskctxb.msp);
int     TCB_pc=&(((TCB *) 0)->tskctxb.pc);
一応動く、こんなところで良さそうだ。

タイマー割り込みのフック
t slp_tsk (100);を入れると iilgal BP になる
  なんとタイマー割り込みのフックすら無い、
  とりあえず確実に動くよう
  clockもS08MCGV3
用に変更->RTCに
 
RTC で1msで割り込ませるのは、ほとんどデフォルトでいい。
 
割り込みのフックはマクロで生成するようになっているが、ここは必質なものなので直書きとする。
 
Cpu_support..cに追加す る、割り込みフラグ解除はなるべく処理の出口でやるようにするのでここには無い。

asm void timer_int(void){
       lea.l   -20(sp), sp
       movem.l d0-d1/a0-a1, (sp)        /* スクラッチレジスタを保存 */
  move.l  sp,a0
  add  #20,a0
  move.l  a0,timer_int_sp

                                  /*  割込み禁止とSR復元の準備             */
       move.w  sr,d1
        /*  割込み禁止                                                   */
        /*     割込みを禁止する前に別の割込みが入った場合の注意点は     */
        /*     cpu_suppourt.Sのret_intを参照                             */
       //move.l  #("str_MAX_IPM" << 8),d0
       move.l  #MAX_IPM,d0
       lsl     # 8,d0
       ori.l   #0x00002000,d0
       move.w  d0,sr
       move.l  #isig_tim, a0
       bra     interrupt_entry        /* C言語ルーチンの先頭アド>レス*/
}

inline展開を取り去る
 
CodeWarriaのコンパイラはnline展開がうまく処理できないようだ

 tslp_tsk (100);を入れると iilgal BP になる件はまだ問題があった。
 tslp_tskで動かなくなった、結局inline展開で関数コールを飛ばしていた。
 GCCから移植はどこでバグるか判らない状態だ。
 Toppers共通部にはinline展開は無かった。

ベクターレジスターをセット
 
Toppersはベクターアドレスを動的に変更できます、FreeScale JMBadgeボードでも有効になっ ています。
 ワンチップではほとんど不用だが、遅い外部ROMより起動する時は速度的に有利だ。
 またデバッガでも利用する。
ColdFirrではVector Base Register (VBR)の機能になる。
 VBR の内容は特権命令の MOVEC で更新できる。
  1MBバウンダリー
  と言う事でCF-V1シリーズでは0x800000以外なく、ここから111*4Byte以上を空けるようリンカーファイルを書き、決め打ちでコピーす る。

リンカーファイル Files/Project Setting/Project.lcf
MEMORY {
   code        (RX)  : ORIGIN = 0x00000410, LENGTH = 0x0001FBF0
   uservect    (RWX) : ORIGIN = 0x00800000, LENGTH = 0x00000200 <-追加
   userram     (RWX) : ORIGIN = 0x00800200, LENGTH = 0x00003e00
}

Sample Soft
Battry管理、SDカードの状態をD83の 点滅で表示する
ランプ表示仕様


 SDが
 無し  消灯
 WP   点滅
 WP無 点燈


 Battryが
 充電中  点滅
 充電完了 点燈
 電源なし 消灯

Coretex-M4
M4はM3と同じプロセスで低電力のまま、処理能力を上げるためいろいろな物が付いて
バスsw的な物が上げられます、これはストリーム処理などに有効。
しかし旨く使わないとM3と同じになってしまう。
バスswについて調べた
 メーカ
 名前
 :形式
 制御の必要

StMicro
STM32F302xB
BusMatrix
 とくに制御の必要はない

Freescale
 Kシリーズ
CrossBar
 必要あり

富士通
MB9B160R
Multi-layer AHB
 必要あり
 
東芝
TMPM440F 開発中
 不明
ということでCoretex-M3のプロファイルを使えるのはSTM32F3だけのようだ。
他のメーカは未調査