NXP MCU 技术论坛
直播中

张飞雄

8年用户 1051经验值
私信 关注
[问答]

S32K312无法使用int_sram_shareable SRAM存储数据怎么解决?

我在定制硬件中使用S32K312 IC (单核)。我已使用 RTD SDK 创建了该项目。
我看到有以下 RAM(大分区)可供我们使用(根据生成的链接器文件):
int_dtcm
int_sram(主)
int_sram_no_cacheable
int_sram_shareable

由于我超出了 RAM 使用量 (int_sram),我能够将一些数据传输到int_sram_no_cacheable分区__attribute__((section(“.int_sram_no_cacheable”)))gcc 关键字。

我想在 int_sram_shareable int_dtcm 部分放置一些变量。一样attribute 命令在使用 int_dtcm 或 int_sram_shareable 时没有任何影响.

总结一下:
1) __attribute__((section(“.int_sram_no_cacheable”))) 工作中
2) __attribute__((section(“.int_dtcm”))) 不工作
3) __attribute__((section(“.int_sram_shareable”))) 不工作

注意:我正在将 section 属性与我的静态变量一起使用。

关于我可能做错了什么的任何意见吗?

回帖(1)

caokyo

2025-3-31 18:16:55

针对S32K312无法使用int_sram_shareableint_dtcm存储数据的问题,以下是逐步解决方案:


1. 检查链接器脚本定义



  • 步骤:打开生成的链接器文件(.ld),确认是否明确定义了.int_dtcm.int_sram_shareable段,并映射到正确的内存地址。


  • 示例


    MEMORY {
      int_dtcm (rwx) : ORIGIN = 0x20000000, LENGTH = 0x10000  /* 确认地址与手册一致 */
      int_sram_shareable (rwx) : ORIGIN = 0x20448000, LENGTH = 0x8000
    }

    SECTIONS {
      .int_dtcm : {
          *(.int_dtcm)  /* 确保段名匹配 */
      } > int_dtcm

      .int_sram_shareable : {
          *(.int_sram_shareable)
      } > int_sram_shareable
    }


  • 修复:若未定义,手动添加对应段或通过SDK配置工具重新生成。




2. 验证变量分配位置



  • 步骤:编译后查看生成的*.map文件,搜索变量地址是否位于目标内存区域(如0x200000000x20448000)。

  • 问题:若变量未出现在预期区域,说明链接器未识别section属性。




3. 调整变量声明方式




  • 使用精确的段名:确保代码中的section名称与链接器脚本完全一致。例如:


    // 将变量分配到int_dtcm
    __attribute__((section(".int_dtcm"))) uint32_t dtcm_data;

    // 将变量分配到int_sram_shareable
    __attribute__((section(".int_sram_shareable"))) uint8_t shared_buffer[1024];


  • 尝试#pragma指令
    #pragma section ".int_dtcm"
    uint32_t dtcm_var;
    #pragma section




4. 检查启动代码初始化



  • TCM初始化:某些芯片需在启动时启用TCM。检查startup_S32K312.S或系统初始化代码中是否有对DTCM的配置:
    /* 示例:启用TCM(具体寄存器参考手册) */
    LDR r0, =0xE0082008  /* TCM控制寄存器地址 */
    LDR r1, =0x00000001  /* 启用DTCM */
    STR r1, [r0]

  • 内存控制器配置:确认共享内存区域无需特殊访问权限设置。




5. 确认缓存/MPU配置



  • 缓存一致性int_sram_shareable通常用于多核共享,需配置为非缓存或一致性缓存。检查MPU/MMU设置:
    // 示例:配置内存区域为Non-cacheable
    MPU->RBAR = 0x20448000 | REGION_ENABLE;
    MPU->RASR = MEMORY_ATTRIBUTE_NON_CACHEABLE;

  • 参考手册:根据S32K312的Cache和MPU章节调整配置。




6. 调整SDK内存配置



  • 使用RTD配置工具:在S32 Design Studio中,通过内存分配工具(如Processor Expert)确认:

    • int_dtcmint_sram_shareable已启用。

    • 分区大小未被其他模块占用。





7. 排除优化干扰



  • 禁用优化:临时在变量前添加volatile关键字,或编译时使用-O0选项,避免变量被优化移除。




8. 最终验证



  1. 修改链接器脚本和代码后,清理并重新编译工程。

  2. 通过调试器读取变量地址,确认位于目标内存区域。

  3. 运行读写测试,验证数据完整性。


常见问题解决



  • 链接器脚本未生效:确保工程使用的是修改后的链接器文件,而非默认模板。

  • 硬件限制:确认int_dtcm是否只能存储特定类型数据(如代码),需参考芯片手册。


通过以上步骤,应能成功将变量分配到目标RAM分区。若问题依旧,建议检查NXP官方社区或提交技术支持请求。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分