ホーム › フォーラム › Texas Instruments › マイコン › C2000 › TMS320F28379D ePWM1割込みについて
このトピックには24件の返信が含まれ、2人の参加者がいます。5 年、 2 ヶ月前に ttkkttkk さんが最後の更新を行いました。
-
投稿者投稿
-
TMS320F28379D ePWM1割込みについて
デバイス型番:TMS320F28379DTMS320F28379D の割込みに関して
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
情報が少なく申し訳ございませんが、ご教授いただけませんでしょうかttkkttkkさん
頂いた情報には記載がございませんが、ソースコードでepwm1_isrをramfuncs_epwm1_isrセクションに指定(#pragma CODE_SECTION( epwm1_isr, “ramfuncs_epwm1_isr” );)されている前提でしょうか。
FLASHからRAMへのコピーにつきまして、セクション”.TI.ramfunc”は、関数InitSysCtrl()でコピーされますが、ユーザーが作成したセクションに関しては、ユーザーコードでコピーいただく必要があります。
このメモリコピー処理は記述いただいておりますでしょうか。
また、コピー元の配置先がRAMLS5とRAM領域となっておりますが、問題ないでしょうか。CCSでデバッグする際は、デバッガ起動時にRAMLS5へプログラム(コピー元データとして)がロードされますが、ターゲットのリセットや電源の切入でクリアされるため、Standalone(デバッガを起動しない状態)では動作しないものと思われます。
ご確認のほど、よろしくお願いいたします。
回答ありがとうございます
#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ファイルに関して分かっておらず申し訳ないのですが、よろしくお願いいたします
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に置き換えてご確認いただけないでしょうか。
ご確認のほど、よろしくお願いいたします。
申し訳ございません
TI-RTOS自体がよくわかっておりません。
プロジェクトのプロパティ等で使用しているかどうかがわかるのでしょうか?ttkkttkkさん
TI-RTOSは、別途TI-RTOSパッケージをインストール頂く必要があります。パッケージをインストールしていなければ、使用されていないと考えます。
インストールの有無につきましては、プロジェクトのプロパティ画面の左にあるリストから「General」をクリックしていただき、右に表示される「Products」パネルに”TI-RTOS for C2000”が表示されているかで判断できます。
表示されていれば、インストールされており、チェックボックスがOnになっていれば使用されています。ご確認をお願いいたします。
ありがとうございます。
プロジェクトのプロパティを確認しましたが、TI-RTOSの表示はありませんでした。
よって、F2837xD_Headers_BIOS_cpu1.cmdのインクルードを
F2837xD_Headers_nonBIOS_cpu1.cmdに変えてみました。しかし、状況は変わりませんでした。
割込みのモジュールもDisassemblyのビューにて確認、
PieVectTable.EPWM1_INT = &epwm1_isr;
も確認はできております。実行するプログラムのモジュールをある程度削除すると
割込みが発生するようになります。度々申し訳ございませんが、再度ご教授をお願いいたします
すみません
プロジェクトを新規で作成しなおし、
.cmdファイルも自作したものを使うことにより
割込み自体は入るようになりました。コピー処理のモジュール単位を増やすと、
以下の箇所で止まるようになりました。
3fe493: 7625 ESTOP0TI社のフォーラムを検索し、以下のことを行ってみましたが
止まる現象は同じでした
・スタックサイズを0x200 → 0x400に変更。
・クロック設定後のコピー処理をクロック設定前に変更。申し訳ございませんが、何か対処法についてわかりましたら教授願います
ttkkttkkさん
頂いている情報が断片的なため、分かる範囲での回答となりますこと、ご了承ください。
3fe493: 7625 ESTOP0
はITRAP ISRによる停止と思われます。未定義の命令が実行された時に実行されるコードになります。
実行コードがRAMへ正しく展開できていない時に発生いたします。当初のリンカコマンドファイルでは、RAM展開コードのコピー元がRAMLS5(LOAD = RAMLS5)となっていましたが、FLASH ROMに定義してお試し頂いておりますでしょうか。
また、考えられる要因として、GSRAMのアクセス権がCPU2に変更されている場合、CPU1からはプログラムのフェッチが行えません。
コピーサイズを増やしていくと、ESTOP0で停止するとのことですが、コピー先がRAMGS0の範囲に収まっている場合は問題ないなど、問題発生の有無の条件をもう少し絞り込むことはできないでしょうか。ご確認のほど、よろしくお願いいたします。
回答ありがとうございます。
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停止が発生
追加されているのは、一番上のモジュールです。
申し訳ございませんが、何かわかる点はないでしょうかコピー処理ですが、コマンドファイルでは、
– 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で停止した際は、発生アドレスとその内容を確認いただくことで、原因特定がスムーズになることがありますので、ご確認頂けますでしょうか。ご確認のほど、よろしくお願いいたします。
回答ありがとうございます
コピー処理は提示の方法で相違ございません。
LOAD_SIZEの追加し再度確認してみます。最後のスタックについての確認方法がわかりません
Disassemblyウィンドウなどに表示がされるものなのでしょうか
CCSは8.1.0を使用しています。まずは、メモリビューにて、スタック内容をご確認ください。
メモリビューからReturn Addressを読み出していただき、Disassemblyビューにそのアドレスを入力していただくと、表示されます。あるいはメモリマップから、実行している関数などをご確認いただくことになると思います。
ご確認のほど、よろしくお願いいたします。
何度も申し訳ございません。
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を知る方法について今一度教授お願いいたします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”と入力いただくことで、その時点のスタックを表示することができます。ご確認のほど、よろしくお願いいたします。
- ISRのコードは、すべてRAMにコピーできておりますでしょうか。
-
投稿者投稿