2404463_ja-JP

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

2404463_ja-JP

2404463_ja-JP

GCCはプラグマステートメントを無視して、コードをITCMメモリに配置します。

こんにちは!

ここでは、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です。


よろしくお願いいたします!

Re: Gcc ignoring pragma statements to place code into ITCM memory.

こんにちは、

カスタムストレージクラスの設定方法については、MathWorksのウェブサイトにある以下のページをご確認ください。プラグマを挿入することによって、メモリ内のデータと関数の配置を制御する。
使用する必要がある部分は、「サブシステム機能とデータのデフォルトメモリ配置を上書きする」です。

SorinIBancila_0-1786627722302.png

カスタムストレージクラスを作成した後は、モデルを読み込むように設定する必要があります:

0. カスタムストレージクラスの作成および構成:

SorinIBancila_5-1786628332348.png



1. コードパースペクティブに入る


SorinIBancila_1-1786628013296.png


2. オープン組み込みコーダー辞書(モデル)

SorinIBancila_2-1786628097732.png


3. 先ほど作成したカスタムクラスを読み込みます。

SorinIBancila_3-1786628212316.png


4. モデル内で新しいサブシステムを作成し、それを原子に設定します。

SorinIBancila_6-1786628433580.png


5. コード生成内で、実行関数のメモリセクションをカスタムクラスで設定されている「MemSection_ITCM」に設定します。

SorinIBancila_7-1786628826071.png


6. arm-none-eabi-objdump が.oを.itcm_textに読み込むときに正しくITCM_ToggleDIO植え替えメモリセクション

SorinIBancila_8-1786631977524.png

arm-none-eabi-nm -n s32k3xx_dio_s32ct.elfも、ITCM_ToggleDIOは0x0住所で見つかると言っています。

SorinIBancila_9-1786632086079.png


もし.elfをS32DSからフラッシュし、内部でブレークポイントを使うと関数s32k3xx_dio_s32c_ITCM_ToggleDIO、逆アセンブルビューでは命令がアドレスから始まる0x0が確認できます。

SorinIBancila_0-1786632484317.png




よろしくお願いします、
ソリン・バンシラ



Re: Gcc ignoring pragma statements to place code into ITCM memory.

こんにちは、ソリンさん

手伝ってくれてありがとう!

私は実際にMathWorksのウェブサイトに掲載されていた指示に従っていました。

これで、プラグマ文の代わりに属性文を挿入する機能が動作するようになりました。


しかし、それでもgccは関数を.itcm_textに挿入することを拒否する。セグメント。

ブロックには以下のコード生成設定を使用します。

RNJ_0-1786705067074.png

次のような関数のコードが生成されます。

/* 標準コード生成をITCMにリダイレクトする */
__attribute__ ((section(".itcm_text")))
static void Motor_Drive_Subsystem(void)
{ .... }

結論:

  • .o に itcm_text セグメントがありませんファイル
  • Gcc は関数を完全に最適化します (.o を逆アセンブルすると確認できます)ファイル)
  • 生成された.cファイルから関数の「static」宣言を削除すると手動で再コンパイルすると、.itcm_text が取得できます。.o のセグメントファイル。
  • どうやら「static」宣言によって、gccコンパイラは属性プレフィックスを無視するようになるようです。

Modelsimでブロックを「再利用可能な関数」に設定すれば、静的宣言が削除されることを期待します。

RNJ_1-1786705067131.png

私は以下を受け取ります:

  • .itcm_text はまだありません.o のセグメントファイル
  • 生成されたCコードでは、関数は依然として「static」として宣言されています。
  • .o の逆アセンブルファイルを見ると、gcc はアセンブリコード内に関数を保持しているが、.itcm_text への指示は見られない。セグメント

では、「静的」宣言が問題なのか(Simulinkや組み込みコーダーの設定に関係しているのか)、それともGCCが「static」を優先して「attribute」宣言を優先している問題なのか?

よろしくお願いいたします。

标记 (1)
无评分
版本历史
最后更新:
星期六
更新人: