こんにちは!
ここでは、S32K3バージョン1.7.1用のMatlab R2025b、Simulink、およびMBDTを使用しています。
私たちが開発中のモーターコントローラアプリケーションの性能を最適化するために、コードの一部をITCMメモリに、さらに後にはデータ用のDTCMメモリに配置したいと考えています。
今のところ、ワークフローをテストするために、ITCMのメモリに関数を配置しようとしています。Simulink/Embedded Coderを使って、以下のような正しいプラグマステートメントをCコードに挿入することに成功しました。
#pragma GCC section text ".itcm_text"
static void Motor_Drive_Subsystem(void)
ヤージュ
..........
}
#pragma GCC セクション テキスト ""
しかし、アプリケーションをコンパイルする際には、gccはこれらのプラグマ文を無視し、コードを標準の.textに配置しますセグメント。これはobjdumpコマンドで結論づけられます:
arm-none-eabi-objdump -h Motor_Control.o (being the .oMotor_Drive_Subsystem関数を含むcファイルから生成されたファイル)
.itcm_text はありませんリストには、.text.xxxx セグメントのみが含まれています (他の非テキストセグメントの中に)。
コンパイル時には、MBDT環境で設定された標準のGCCスイッチを使用しています。
arm-none-eabi-gcc -O2 -c -std=c99 -fshort-enums -funsigned-char -fstack-usage -ffunction-sections -fdata-sections -g -pedantic -Wall -Wextra -fmessage-length=0 -funsigned-bitfields -fno-common -Wunused -Wstrict-prototypes -Wsign-compare -Werror=implicit-function-declaration -mcpu=cortex-m7 -mthumb -mlittle-endian -mfloat-abi=hard -mfpu=FPV5-sp-d16 -DD_CACHE_ENABLE -DI_CACHE_ENABLE -specs=nano.specs -specs=nosys.specs --sysroot="C:\MATLAB_Add-Ons\Toolboxes\NXP_MBDToolbox_S32K3\tools\build_tools\gcc_v10.2\gcc-10.2-arm32-eabi\arm-none-eabi\newlib」-DSTEP_GPT_TIMER -DSTEP_GPT_CHANNEL=GptConf_GptChannelConfiguration_StepTimer -DSTEP_GPT_CHANNEL_FREQ=40000000 -DSTEP_GPT_CHANNEL_VALUE_MAX=4294967295 -DAUTOSAR_OS_NOT_USED -D__MW_TARGET_USE_HARDWARE_RESOURCES_H__ -DGCC -DS32K3XX -DS32K396 -DCPU_S32K396 -DENABLE_FPU -DMPU_ENABLE -DMBDT_INIT -DCLASSIC_INTERFACE=0 -DALLOCATIONFCN=0 -DTERMFCN=0 -DONESTEPFCN=1 -DMAT_FILE=0 -DMULTI_INSTANCE_CODE=0 -DINTEGER_CODE=0 -DMT=0 -DTID01EQ=0 -DSTACK_SIZE=64 -DRT -DMODEL=Motor_Control -DNUMST=1 -DNCSTATES=0 -DHAVESTDIO -DMODEL_HAS_DYNAMICALLY_LOADED_SFCNS=0 -IC: .....
生成されたcコードファイルを修正し、手動でコンパイルすることで、次の結論が得られます。
関数の「static」宣言を削除しても効果はありません。しかし、「static」を削除し、関数に属性ステートメントを追加するという別の方法を使用すると、次のようになります。
static void __attribute__((section(".itcm_text")))Motor_Drive_Subsystem(void);
.itcm_textを作成します.o のセグメントファイル。
私が何か間違ったことをしているのか、それともツールに問題があるのか、よく分かりません。
これをうまく動かす方法を誰か教えてもらえますか?
もちろん、ツールチェーンにこの処理を任せたいので、コード生成後にCコードを手動で修正したくはありません。
私の見る限り、startup_cm7.Sのようですまた、ITCMおよびDTCMメモリを処理するためにlinker_flash_s32k396.ldファイルが用意されています。
フォーラムでこの投稿を見つけました。関連性があるかどうかはわかりませんが、こちらです: https://community.nxp.com/t5/S32-Design-Studio/No-GCC-11-4-item-in-new-project-wizard-dialog-on-S32D...
MBDTのgccはビルド1728のようですが、投稿で修正されているものはビルド1803です。
よろしくお願いいたします!
こんにちは、
カスタムストレージクラスの設定方法については、MathWorksのウェブサイトにある以下のページをご確認ください。プラグマを挿入することによって、メモリ内のデータと関数の配置を制御する。
使用する必要がある部分は、「サブシステム機能とデータのデフォルトメモリ配置を上書きする」です。
カスタムストレージクラスを作成した後は、モデルを読み込むように設定する必要があります:
0. カスタムストレージクラスの作成および構成:
1. コードパースペクティブに入る
2. オープン組み込みコーダー辞書(モデル)
3. 先ほど作成したカスタムクラスを読み込みます。
4. モデル内で新しいサブシステムを作成し、それを原子に設定します。
5. コード生成内で、実行関数のメモリセクションをカスタムクラスで設定されている「MemSection_ITCM」に設定します。
6. arm-none-eabi-objdump が.oを.itcm_textに読み込むときに正しくITCM_ToggleDIO植え替えメモリセクション
arm-none-eabi-nm -n s32k3xx_dio_s32ct.elfも、ITCM_ToggleDIOは0x0住所で見つかると言っています。
もし.elfをS32DSからフラッシュし、内部でブレークポイントを使うと関数s32k3xx_dio_s32c_ITCM_ToggleDIO、逆アセンブルビューでは命令がアドレスから始まる0x0が確認できます。
よろしくお願いします、
ソリン・バンシラ
こんにちは、ソリンさん
手伝ってくれてありがとう!
私は実際にMathWorksのウェブサイトに掲載されていた指示に従っていました。
これで、プラグマ文の代わりに属性文を挿入する機能が動作するようになりました。
しかし、それでもgccは関数を.itcm_textに挿入することを拒否する。セグメント。
ブロックには以下のコード生成設定を使用します。
次のような関数のコードが生成されます。
/* 標準コード生成をITCMにリダイレクトする */
__attribute__ ((section(".itcm_text")))
static void Motor_Drive_Subsystem(void)
{ .... }
結論:
Modelsimでブロックを「再利用可能な関数」に設定すれば、静的宣言が削除されることを期待します。
私は以下を受け取ります:
では、「静的」宣言が問題なのか(Simulinkや組み込みコーダーの設定に関係しているのか)、それともGCCが「static」を優先して「attribute」宣言を優先している問題なのか?
よろしくお願いいたします。