Renesas Rulz
Renesas Rulz
  • User
    Join or sign in
  • Site
  • Search RenesasRulz.com
  • User
  • Renesas Rulz
  • More
  • Cancel
マルツエレック株式会社
  • パートナー製品
  • More
マルツエレック株式会社
SH7216 CPUボード&Arduinoライブラリ付き変換ボード RTOS付きUSBデバッガ・ワークショップ
  • Forums
  • Blog
  • Files
  • Tags
  • More
  • Cancel
  • New
  • Replies 3 replies
  • Subscribers 56 subscribers
  • Views 3217 views
  • Users 0 members are here
  • SH2A SH2A-FPU μITRON RTOS
Options
  • Share
  • More
  • Cancel

RTOS付きUSBデバッガ・ワークショップ

@chobichan
@chobichan over 6 years ago

参加して来ました。E10Aが無くともμITRON(HI7000/4)のデバックのかなりの事ができます。

但しRTOSが動くのはあくまでもUSBデバッガー上のみで、一度電源を落とすとユーザープログラムは消えてしまいます。それ以外の制限もままあります。

とは言えμITRONの学習目的としてはとてもいい感じです。HEWの無償版に無償版のデバッグエクステンションを組み合わせた画面が上の画面です。

下のペインにタスク情報、セマフォ情報、周期ハンドラ情報を表示しています。タスク遷移のチャートも表示できますヨ。

----------------------------------------------------------

先日のSH2Aのワークショップであの方がアナウンスされていたワークショップですね。

http://japan.renesas.com/support/seminar/peer/sh_usb_debugger_ws.jsp?campaign=sh20th_201407

USBデバッカー、μITRON仕様RTOS、実に楽しみです。

是非参加しようと思っていますが、既に基板を持っている人はやっぱり5400円で追加購入?

  • Reply
  • Cancel
  • Cancel
  • jupiter_m
    jupiter_m over 6 years ago
    ★電源断時に揮発してしまうUSB デバッガの内部ワークの復旧方法
     
    RAMにあるデータが電源断時に揮発してしまう
    →スタンドアロンで起動しない。
     
    RAM ワークエリアのどこかにしまわれているのなら、
    場所を見つけて復旧してやればよいはず。
     
    <ワークエリアの探索>
     
    コンフィグレーション>Debug>最適化リンカ>ベリファイ情報
     
    から、
     
    デバッガ本体は 0x000E0000 ~
    ワークエリアは 0xFFF9F800 ~ と推測される。
     
    そこで、Non-OS(normal_project)サンプルの
    エントリアドレス 0x400 が格納されているところを、
    デバッガにダウンロード直後にメモリビューで探してみる。
     
     
    ワークエリアの先頭 0xFFF9F800 にいきなり見つかった。
    次のワードはユーザスタックアドレスのようだ(推測)
     
    Address
    0xFFF9F800    ユーザプログラムスタートエントリ (0x400(BARE METAL) or 0x000E3000(RTOS))
    0xFFF9F804 ユーザスタックエントリ (0xFFF9F800)
    そこでこの2ワードを書きとめ電源OFF。
    RESET で起動しないことを確認してから、
    ダウンロード前にメモリビューから手で2ワード復旧してみて、
    デバッガを切り離し、RESET で起動することを確認。
     
    毎回手で書くのではデバッガダウンロードと変わらないので、
    モニタ mot に埋め込むことを考える。
     
    とりあえず ENTRY,SP を定数とバックアップコピーから復旧してみることにする。
     
    <ENTRY,SP 復旧コード例>
     
    まず下記のように C で関数を書いてビルドし、
    逆アセンブルビューでマシンコードを取り出す
     
    1.定数書き込み
     
    定数書き込みでは Non-OS,RTOS とエントリポイントが違うので、
    エントリポイントごとにモニターの mot ファイルを分ける必要がある。
    void restorework(void) 
    {
         int *entry = (int *)0xFFF9F800 ;
         entry[0] = 0x400 ;
         entry[1] = (int)entry ;
    }
     
    <Non-OS(normal_project) Sample : ENTRY=400H,SP=0xFFF9F800>
    00000000 0290F800 _restore MOVI20    #H'9F800,R2
    00000004 E604              MOV       #H'04,R6
    00000006 4618              SHLL8     R6
    00000008 2262              MOV.L     R6,@R2
    0000000A 1221              MOV.L     R2,@(H'04:4,R2)

    <RTOS Sample : ENTRY=E3000H,SP=0xFFF9F800>
    00000000 0290F800 _restore MOVI20    #H'9F800,R2
    00000004 06010E30          MOVI20S   #H'00E3000,R6
    00000008 2262              MOV.L     R6,@R2
    0000000A 1221              MOV.L     R2,@(H'04:4,R2)
    2.マニュアルリセット(や予約ベクタ領域等)からのコピー
    こちらの場合、モニタの mot はわけなくてもいいが
    コピー元として決めたアドレス(マニュアルリセットの場合 0x8,0xC)に
    Entry,SP が生成されるように デバッグターゲットのvecttbl.c を修正する必要あり。
    void copymanreset(void)
    {
         int *from = (int *)0x00000008 ;
         int *to   = (int *)0xFFF9F800 ;
         to[0] = from[0] ;
         to[1] = from[1] ;
    }
    <Copy from ManualResetEntry>
    00000000 E608     _copyman MOV       #H'08,R6
    00000002 0590F800          MOVI20    #H'9F800,R5
    00000006 6162              MOV.L     @R6,R1
    00000008 2512              MOV.L     R1,@R5
    0000000A 5461              MOV.L     @(H'04:4,R6),R4
    0000000C 1541              MOV.L     R4,@(H'04:4,R5)
    どちらの場合も、とくに位置に依存するようなコードはなさそう。
     
    このコードを、配布されたモニタのどこかに埋め込みたい。
     
    候補として、一番簡単な、起動時の FRQCR 設定にある
    (RAM に転送されて実行されると思われる箇所です)
    大量の NOP の末尾に放り込んでみる。
     
    ただし、FRQCR の設定後の NOP 数の必要条件から外れるので、
    自己責任で。
    (内部 RAM アクセスで完結するので、大丈夫なのでは?)

    該当箇所は NOP(0x0009) がたくさん並んでいるので、
    .mot ファイルをテキストエディタで開いて目視ですぐに
    見つけられる。

    mot ファイルは ASCII なのでそのまま書きかえられそうに思うが、
    そうするとチェックサムが変わってしまうので、計算が面倒だ。
     
    そこで .mot ファイル編集ツール(たとえば xedit)で編集し、
    S レコード出力をして、その mot を焼いて実験。
     
    <デバッグターゲット改修の例>
     
    エントリポイントと初期SPは本来なら FLASH の(ベクタテーブルの)
    先頭に書かれているはず(vecttbl.c)だが、デバッガに飛ぶようにすり替えられるため、
    すり替えられないアドレス(ここではマニュアルリセットや予約ベクタ領域など)にコピーを置いておく必要がある。
    マニュアルリセットを使うのであれば、vecttbl.c の 0x8,0x0C に 0x0,0x4 と同じワードが生成されるように改修が必要。
    void *RESET_Vectors[] = {
    //;<<VECTOR DATA START (POWER ON RESET)>>
    //;0 Power On Reset PC
        (void*)     PowerON_Reset_PC,                                                                                                               
    //;<<VECTOR DATA END (POWER ON RESET)>>
    // 1 Power On Reset SP
        __secend("S"),
    //;<<VECTOR DATA START (MANUAL RESET)>>
    //;2 Manual Reset PC
        //(void*)     Manual_Reset_PC,                                                                                                                
        (void*)     PowerON_Reset_PC,            // for restore in debugger                                                                                                   
    //;<<VECTOR DATA END (MANUAL RESET)>>
    // 3 Manual Reset SP
        __secend("S") // for restore in debugger

    };
    • Cancel
    • Up 0 Down
    • Reply
    • Cancel
  • jupiter_m
    jupiter_m over 6 years ago in reply to jupiter_m

    ★USBデバッガの書き込みエラー対策方法

    プログラムサイズが大きくなってくると、abs ファイルのダウンロードに失敗する例がでてきます。

    <0x1Fxx 番地以降のプログラムが正しく書けていない例>

    この問題が発生した場合、回避する方法として、

    メニューのデバッグ>デバッグの設定 から、

     
    ① ダウンロードモジュールに拡張子「.mot」のSタイプを追加
    ② 拡張子「.abs」のELFフォーマットは、デバッグ情報のみ読み込む
    ③ 機械語は拡張子「.mot」のSタイプでダウンロードする
     
    で、回避できるようです。
     
    #本件は、講師の方に教えていただきました。
    • Cancel
    • Up 0 Down
    • Reply
    • Cancel
  • @chobichan
    @chobichan over 6 years ago in reply to jupiter_m

    スタンドアローンで動かないのはライセンス上の問題と思われるので、まあそこをおおぴらにしない方が。

    • Cancel
    • Up 0 Down
    • Reply
    • Cancel
サイト使用条件
プライバシーポリシー
お問い合わせ
© 2010-2021 Renesas Electronics Corporation. All rights reserved.