ホーム フォーラム Texas Instruments マイコン C2000 TMS320F28379D ePWM1割込みについて

このトピックには24件の返信が含まれ、2人の参加者がいます。4 年、 12 ヶ月前 ttkkttkk さんが最後の更新を行いました。

15件の投稿を表示中 - 1 - 15件目 (全26件中)
  • 投稿者
    投稿
  • #7739 返信

    ttkkttkk
    参加者

    TMS320F28379D ePWM1割込みについて

    デバイス型番:TMS320F28379D

    TMS320F28379D の割込みに関して
    ePWM1を使い、タイマ割込み処理を発生させるプログラムを製作しています

    割込み対象モジュールepwm1_isrをFLASHの領域からRAMの領域にコピーし
    実行させようとしておりますが、
    コピー処理を行うと、割込みが入らなくなる現象が発生しております。

    以下、cmdファイルの一部です。
    ramfuncs_epwm1_isr
    : LOAD = RAMLS5,
    RUN = RAMGS0 | RAMGS1 | RAMGS2 | RAMGS3,
    LOAD_START( _RamfuncsLoadStart_epwm1_isr ),
    LOAD_END( _RamfuncsLoadEnd_epwm1_isr ),
    RUN_START( _RamfuncsRunStart_epwm1_isr ),
    PAGE = 1
    情報が少なく申し訳ございませんが、ご教授いただけませんでしょうか

    #7749 返信
    Yojiro
    Yojiro
    従業員

    ttkkttkkさん

    頂いた情報には記載がございませんが、ソースコードでepwm1_isrをramfuncs_epwm1_isrセクションに指定(#pragma CODE_SECTION( epwm1_isr, “ramfuncs_epwm1_isr” );)されている前提でしょうか。

    FLASHからRAMへのコピーにつきまして、セクション”.TI.ramfunc”は、関数InitSysCtrl()でコピーされますが、ユーザーが作成したセクションに関しては、ユーザーコードでコピーいただく必要があります。

    このメモリコピー処理は記述いただいておりますでしょうか。

     

    また、コピー元の配置先がRAMLS5とRAM領域となっておりますが、問題ないでしょうか。CCSでデバッグする際は、デバッガ起動時にRAMLS5へプログラム(コピー元データとして)がロードされますが、ターゲットのリセットや電源の切入でクリアされるため、Standalone(デバッガを起動しない状態)では動作しないものと思われます。

     

    ご確認のほど、よろしくお願いいたします。

    #7751 返信

    ttkkttkk
    参加者

    回答ありがとうございます

    #pragma CODE_SECTION( epwm1_isr, “ramfuncs_epwm1_isr”)の記載も

    FLASHからRAMへのメモリコピー処理も行っております。

    上記cmdファイルは2ファイル、プロジェクト上にあり、
    F2837xD_headers\cmd\F2837xD_Headers_BIOS_cpu1.cmd
    2837xD_FLASH_lnk_cpu1.cmd
    の両方をリンクしており、上記の記載は2837xD_FLASH_lnk_cpu1.cmdのほうで
    記載しております。

    TI社のフォーラムにて

    BIOSを使用するのがよくない?との記載されているのですが
    2ファイル存在するため起こっている現象なのでしょうか?

    cmdファイルに関して分かっておらず申し訳ないのですが、よろしくお願いいたします

    #7752 返信
    Yojiro
    Yojiro
    従業員

    ttkkttkkさん

    次の2点をご確認いただけますでしょうか。

    • ISRのコードは、すべてRAMにコピーできておりますでしょうか。
      CCSのメモリビューあるいは逆アセンブルビューでRamfuncsLoadStart_epwm1_isrとRamfuncsRunStart_epwm1_isrを比較いただければ、確認いただけるものと思います
    • PieVectTable.EPWM1_ISR にepwm1_isrのアドレスが登録されておりますでしょうか。

    リンカコマンドファイル「F2837xD_headers\cmd\F2837xD_Headers_BIOS_cpu1.cmd」をお使いいただいているとのことですが、TI-RTOSをご利用されておりますでしょうか。TI-RTOS未使用の場合は、このファイルをF2837xD_Headers_nonBIOS_cpu1.cmdに置き換えてご確認いただけないでしょうか。

     

    ご確認のほど、よろしくお願いいたします。

    #7754 返信

    ttkkttkk
    参加者

    申し訳ございません
    TI-RTOS自体がよくわかっておりません。
    プロジェクトのプロパティ等で使用しているかどうかがわかるのでしょうか?

    #7755 返信
    Yojiro
    Yojiro
    従業員

    ttkkttkkさん

    TI-RTOSは、別途TI-RTOSパッケージをインストール頂く必要があります。パッケージをインストールしていなければ、使用されていないと考えます。

    インストールの有無につきましては、プロジェクトのプロパティ画面の左にあるリストから「General」をクリックしていただき、右に表示される「Products」パネルに”TI-RTOS for C2000”が表示されているかで判断できます。
    表示されていれば、インストールされており、チェックボックスがOnになっていれば使用されています。

     

    ご確認をお願いいたします。

    #7756 返信

    ttkkttkk
    参加者

    ありがとうございます。
    プロジェクトのプロパティを確認しましたが、TI-RTOSの表示はありませんでした。
    よって、F2837xD_Headers_BIOS_cpu1.cmdのインクルードを
    F2837xD_Headers_nonBIOS_cpu1.cmdに変えてみました。

    しかし、状況は変わりませんでした。

    割込みのモジュールもDisassemblyのビューにて確認、
    PieVectTable.EPWM1_INT = &epwm1_isr;
    も確認はできております。

    実行するプログラムのモジュールをある程度削除すると
    割込みが発生するようになります。

    度々申し訳ございませんが、再度ご教授をお願いいたします

    #7758 返信

    ttkkttkk
    参加者

    すみません
    プロジェクトを新規で作成しなおし、
    .cmdファイルも自作したものを使うことにより
    割込み自体は入るようになりました。

    コピー処理のモジュール単位を増やすと、
    以下の箇所で止まるようになりました。
    3fe493: 7625 ESTOP0

    TI社のフォーラムを検索し、以下のことを行ってみましたが
    止まる現象は同じでした
    ・スタックサイズを0x200 → 0x400に変更。
    ・クロック設定後のコピー処理をクロック設定前に変更。

    申し訳ございませんが、何か対処法についてわかりましたら教授願います

    #7934 返信
    Yojiro
    Yojiro
    従業員

    ttkkttkkさん

    頂いている情報が断片的なため、分かる範囲での回答となりますこと、ご了承ください。

    3fe493: 7625 ESTOP0

    はITRAP ISRによる停止と思われます。未定義の命令が実行された時に実行されるコードになります。
    実行コードがRAMへ正しく展開できていない時に発生いたします。

    当初のリンカコマンドファイルでは、RAM展開コードのコピー元がRAMLS5(LOAD = RAMLS5)となっていましたが、FLASH ROMに定義してお試し頂いておりますでしょうか。

    また、考えられる要因として、GSRAMのアクセス権がCPU2に変更されている場合、CPU1からはプログラムのフェッチが行えません。
    コピーサイズを増やしていくと、ESTOP0で停止するとのことですが、コピー先がRAMGS0の範囲に収まっている場合は問題ないなど、問題発生の有無の条件をもう少し絞り込むことはできないでしょうか。

    ご確認のほど、よろしくお願いいたします。

    #7938 返信

    ttkkttkk
    参加者

    回答ありがとうございます。
    cmdファイルは以下のように変更しております。

    PAGE 0 : /* Program Memory */
    /* Program Space */
    RAMLS0_5 : origin = 0x008000, length = 0x003000 /* Ram for Program */

    RAMM0 : origin = 0x000122, length = 0x0002DE
    RAMD0 : origin = 0x00B000, length = 0x000800

    /* BootROM Vector */
    RESET : origin = 0x3FFFC0, length = 0x000002 /* Reset Vector */

    /* Flash Rom */
    BEGIN : origin = 0x080000, length = 0x000002 /* Program Start(Boot to FLASH) */
    FLASHA : origin = 0x080002, length = 0x001FFE /* Flash Rom */
    FLASHB : origin = 0x082000, length = 0x002000 /* Flash Rom */
    FLASHC : origin = 0x084000, length = 0x002000 /* Flash Rom */
    FLASHD : origin = 0x086000, length = 0x002000 /* Flash Rom */
    FLASHEF : origin = 0x088000, length = 0x00FFFE /* Flash Rom */
    FLASHEF_SUM : origin = 0x097FFE, length = 0x000002 /* Flash Rom Sum */
    FLASHG : origin = 0x098000, length = 0x008000 /* Flash Rom */
    FLASHH : origin = 0x0A0000, length = 0x008000 /* Flash Rom */
    FLASHI : origin = 0x0A8000, length = 0x008000 /* Flash Rom */
    FLASHJ : origin = 0x0B0000, length = 0x008000 /* Flash Rom */
    FLASHK : origin = 0x0B8000, length = 0x002000 /* Flash Rom */
    FLASHL : origin = 0x0BA000, length = 0x002000 /* Flash Rom */
    FLASHM : origin = 0x0BC000, length = 0x002000 /* Flash Rom */
    FLASHN : origin = 0x0BE000, length = 0x002000 /* Flash Rom */

    中略

    ramfuncs_epwm7_isr
    : LOAD = FLASHC,
    RUN = RAMLS0_5,
    LOAD_START( _RamfuncsLoadStart_epwm7_isr ),
    LOAD_END( _RamfuncsLoadEnd_epwm7_isr ),
    RUN_START( _RamfuncsRunStart_epwm7_isr ),
    PAGE = 0

    コピー元はFLASHの定義でも試しております。(同じ現象となります)
    マップファイルよりコピー処理の部分を抜粋します
    ramfuncs_epwm7_isr
    * 0 00084000 0000004c RUN ADDR = 00008000
    00084000 0000004c Interrupt.obj (ramfuncs_epwm7_isr:retain)

    ramfuncs_InitSetRegisterFlash
    * 0 0008404c 00000015 RUN ADDR = 0000804c
    0008404c 00000015 Initial.obj (ramfuncs_InitSetRegisterFlash)

    ramfuncs_CtrlMainLoop
    * 0 00084061 00000001 RUN ADDR = 00008061
    00084061 00000001 MainLoop.obj (ramfuncs_CtrlMainLoop)

    上記の3モジュールのコピーだけであればESTOP0停止なし

    ramfuncs_ReadEEPROM
    * 0 00084000 00000089 RUN ADDR = 00008000
    00084000 00000089 MainLoop.obj (ramfuncs_ReadEEPROM)

    ramfuncs_epwm7_isr
    * 0 00084089 0000004c RUN ADDR = 00008089
    00084089 0000004c Interrupt.obj (ramfuncs_epwm7_isr:retain)

    ramfuncs_InitSetRegisterFlash
    * 0 000840d5 00000015 RUN ADDR = 000080d5
    000840d5 00000015 Initial.obj (ramfuncs_InitSetRegisterFlash)

    ramfuncs_CtrlMainLoop
    * 0 000840ea 00000001 RUN ADDR = 000080ea
    000840ea 00000001 MainLoop.obj (ramfuncs_CtrlMainLoop)

    上記の4モジュールにすると、ESTOP0停止が発生
    追加されているのは、一番上のモジュールです。
    申し訳ございませんが、何かわかる点はないでしょうか

    #8000 返信
    Yojiro
    Yojiro
    従業員

    コピー処理ですが、コマンドファイルでは、
    – LOAD_START
    – LOAD_END
    – RUN_START
    のみの定義となっております。

    この場合、以下のコピー処理となると思いますが、あっていますでしょうか。

    memcpy( &RamfuncsRunStart_epwm7_isr, &RamfuncsLoadStart_epwm7_isr , (size_t)(&RamfuncsLoadEnd_epwm7_isr – &RamfuncsLoadStart_epwm7_isr)+1 );

    あるいは、コマンドファイルにLOAD_SIZEを追加いただき、LOAD_SIZEによるサイズ指定でメモリコピーを実施してみて頂けないでしょうか。

     

    ITRAPの発生時は、スタックにReturn Addressとして発生時のプログラムカウンタが保存されています。
    SPが偶数の場合はSP+2, SPが奇数の場合はSP+3のスタックに保存されていますので、Disassemblyなどで解析することで発生理由が明確になることがあります。
    ESTOP0で停止した際は、発生アドレスとその内容を確認いただくことで、原因特定がスムーズになることがありますので、ご確認頂けますでしょうか。

    ご確認のほど、よろしくお願いいたします。

    #8006 返信

    ttkkttkk
    参加者

    回答ありがとうございます

    コピー処理は提示の方法で相違ございません。
    LOAD_SIZEの追加し再度確認してみます。

    最後のスタックについての確認方法がわかりません
    Disassemblyウィンドウなどに表示がされるものなのでしょうか
    CCSは8.1.0を使用しています。

    #8007 返信
    Yojiro
    Yojiro
    従業員

    まずは、メモリビューにて、スタック内容をご確認ください。

    メモリビューからReturn Addressを読み出していただき、Disassemblyビューにそのアドレスを入力していただくと、表示されます。あるいはメモリマップから、実行している関数などをご確認いただくことになると思います。

    ご確認のほど、よろしくお願いいたします。

    #8008 返信

    ttkkttkk
    参加者

    何度も申し訳ございません。
    StepOver(F6)で進める場合と
    StepInto(F5)で進める場合で挙動が異なり、

    F6で進めた場合、上記の「3fe493: 7625 ESTOP0 」で
    Break at addressとなり、Memory Browserでスタック領域(0x000400)を確認しましたが
    全てゼロで表示されるような結果となりました。

    F5の場合は、「0x200008」のアドレスで止まり、
    スタック領域は更新されておりますが、以下の領域で
    どこがSPに当たるのかが理解できておりません。
    _stack
    C054 0000 952D 0008 95EF 0008 95FB 0008 8920 0008 938B 0008 0000 0001 00C8
    0018 0001 0000 0000 0000 0003 FFFF EA0A 0033 0004 001F 958C 0008 0020 0000
    0000 0004 0096 FFFF 0000 0001 C1E2 0000 0001 0000 0000 0000 0000 0000 0000
    :
    何度も申し訳ございませんが、SPを知る方法について今一度教授お願いいたします

    #8009 返信
    Yojiro
    Yojiro
    従業員

    ttkkttkkさん

    まずはじめに、先日の回答で誤りがありましたので、訂正させていただきます。

    ITRAPの発生時は、スタックにReturn Addressとして発生時のプログラムカウンタが保存されています。
    SPが偶数の場合はSP+2, SPが奇数の場合はSP+3のスタックに保存されていますので、Disassemblyなどで解析することで発生理由が明確になることがあります。

    C2000では、スタックはアドレスを加算する方向に積まれます。そのため、ISRからReturn Addressを確認する場合は、SPから減算(SP-2またはSP-3)することになります。実際には、ISRハンドラの内容によっては、CPUレジスタの退避も行われますので、SP-8またはSP-9になることもあります。

    SPの内容につきましては、Registersビューの「Core Registers」にて確認いただけます。
    また、Memoryビューのアドレス入力欄に”SP”と入力いただくことで、その時点のスタックを表示することができます。

     

    ご確認のほど、よろしくお願いいたします。

15件の投稿を表示中 - 1 - 15件目 (全26件中)