在使用 SPD104 时,我遇到了一些有关链接文件的问题。目前,我使用的是 iar 9.50.2 版。从 S32DS 转换为 iar 时生成的 icf 文件不包括与 SPD 相关的内容。请参阅 SPD104 手册中有关 eMcem_MemMap 的部分。在 icf 文件中增加了一些分段分配,但仍然遇到了一些问题。
最常遇到的错误是
错误[Lp005]:位置包含内容的混合部分(例如"rw 数据部分 .s32_saf_bss in eMcem.o符号:[eMcem_DriverState]") [适合放在 ROM 中] 和无内容的部分(例如"zi section .bss in abs.o symbols: [abs_output]") [适合放在 RAM 中] 。
例如,从代码来看,eMcem_MemMap.h 中有如下代码
#ifdef EMCEM_START_SEC_VAR_ZERO_INIT_UNSPECIFIED
/ * *
* @file eMcem_MemMap.h
* @violates @ref eMcem_MemMap_h_REF_1
*/
#undef EMCEM_START_SEC_VAR_ZERO_INIT_UNSPECIFIED
/ * *
* @file eMcem_MemMap.h
* @violates @ref eMcem_MemMap_h_REF_1
*/
#undef MEMMAP_ERROR
#pragma ghs section bss=".s32_saf_bss"
#endif
根据手册中的理解,此处的.s32_saf_bss 段应该是放置在 RAM 中的一段,而不是 eMcem.c 中的一段、有以下代码
#define EMCEM_START_SEC_VAR_ZERO_INIT_UNSPECIFIED
/* @* 违反 @ref eMcem_c_REF_0410 */
/* @violates @ref eMcem_c_REF_2001 */
#include"eMcem_MemMap.h"
/ * *
* @brief 驱动器状态。
* 在启动或运行期间,eMCEM 驱动程序从 EMCEM_S_UINIT 变为 EMCEM_S_INITIALIZED。
* 如果配置锁类型设置为 HARD_LOCK,驱动程序会锁定其配置
* 并将其状态更改为 EMCEM_S_LOCKED。
*/
eMcem_StateType eMcem_DriverState = EMCEM_S_UNINIT;
#define EMCEM_STOP_SEC_VAR_ZERO_INIT_UNSPECIFIED
在代码中,eMcem_DriverState 被明确赋值。尽管此处的赋值为 0,但根据规则,应将其放在数据部分中
我可以对编译器进行配置,强行纠正变量的段分配逻辑:将本应属于"no content" 的显式零初始化变量从.data 段(有内容)移至.bss 段(无内容),使其符合链接器脚本中的要求,即只有"no content 段" 才能放置在 RAM 区域,从而解决混合放置的冲突。但我认为这不是解决问题的根本办法
有没有更合理的办法解决这个问题?
嗨,@Neo1096、
您能使用本主题中的链接器文件吗?
https://community.nxp.com/t5/S32K/S32K3-SPD-DMA/m-p/2139734
BR,丹尼尔