SPD104 の使用時にリンク ファイルに関するいくつかの問題が発生しました。現在、iar バージョン 9.50.2 を使用しています。S32DS から iar に変換するときに生成される icf ファイルには、SPD 関連のコンテンツが含まれません。SPD104 マニュアルの eMcem_MemMap に関するセクションを参照します。いくつかのセグメント割り当てが icf ファイルに追加されましたが、依然としていくつかの問題が発生しました。
最も頻繁に発生するエラーは次のとおりです
エラー[Lp005]: 配置にコンテンツを含むセクションが混在しています(例:eMcem.oのrwデータセクション.s32_saf_bssシンボル: [eMcem_DriverState]") [ROM への配置に適しています] およびコンテンツのないセクション (例: "zi section .bss in abs.o シンボル: [abs_output]") [RAM への配置に適しています]
コードから、例えば、eMcem_MemMap.hには次のコードがあります。
#ifdef EMCEM_START_SEC_VAR_ZERO_INIT_UNSPECIFIED
/ * *
* @file eMcem_MemMap.h
* @ref eMcem_MemMap_h_REF_1 に違反します
*/
#undef EMCEM_START_SEC_VAR_ZERO_INIT_UNSPECIFIED
/ * *
* @file eMcem_MemMap.h
* @ref eMcem_MemMap_h_REF_1 に違反します
*/
#未定義 MEMMAP_ERROR
#pragma ghs セクション bss=".s32_saf_bss"
#endif
マニュアルの理解によれば、ここの.s32_saf_bssセグメントはRAMに配置されるセグメントであるはずだが、eMcem.cでは、次のコードがあります
#定義 EMCEM_START_SEC_VAR_ZERO_INIT_UNSPECIFIED
/* @ref eMcem_c_REF_0410 に違反します */
/* @ref eMcem_c_REF_2001 に違反します */
#include "eMcem_MemMap.h"
/ * *
* @brief ドライバの状態。
* @details eMCEM ドライバは、起動時または実行時に状態を EMCEM_S_UINIT から EMCEM_S_INITIALIZED に変更します。
* 構成ロックタイプがHARD_LOCKに設定されている場合、ドライバは構成をロックします
* 状態を EMCEM_S_LOCKED に変更します。
*/
eMcem_StateType eMcem_DriverState = EMCEM_S_UNINIT;
#EMCEM_STOP_SEC_VAR_ZERO_INIT_UNSPECIFIED を定義します
コードでは、eMcem_DriverState に明示的に値が割り当てられています。ここでの割り当ては0ですが、ルールによれば、データセクションに配置する必要があります。
変数のセグメント割り当てロジックを強制的に修正するようにコンパイラを設定できます。つまり、「コンテンツなし」に属する必要がある明示的にゼロ初期化された変数を、.data セグメント (コンテンツあり) から .bSS セグメント (コンテンツなし) に移動し、リンカー スクリプトの要件 (RAM 領域には「コンテンツなしセグメント」のみを配置できる) に準拠させて、混合配置の競合を解決します。しかし、これは根本的な問題の解決策ではないと思う。
この問題に対するより合理的な解決策はあるでしょうか?
こんにちは@Neo1096さん、
このThreadのリンカーファイルを使用できますか?
https://community.nxp.com/t5/S32K/S32K3-SPD-DMA/mp/2139734
BR、ダニエル