你好 ,
我正在尝试在 s32k358 多核处理器中使用共享内存。
我正在学习用户自定义示例,
当我尝试在buzzer_state_shared_data_U32 中赋值时(目前只有核心 0 访问此内存),核心 0 挂起并 swt 重置控制器。
但是当我把代码烧录到调试闪存中时,它运行正常。上电复位后,核心 0 卡住。
为什么刷机时运行正常,而断电重启后却无法运行?
nirmal_masilamani_0-1783316750067.png
你好@Julián_AragónM ,
感谢您的快速回复。
我检查了启动文件,SRAM 初始化正在进行。
我已附上启动文件和链接器文件。请协助我解决这个问题。
但是当我把代码烧录到调试闪存中时,它运行正常。上电复位后,核心 0 卡住。
这很可能是由ECC RAM错误引起的。通常情况下,调试器会在易失性存储器上初始化 ECC,但是,在开机和关机时,调试器不会初始化 RAM,因此在尝试访问内存时会发生硬故障。
这通常是在启动代码中,在 main 函数之前完成的。
该部分还应配置为不可缓存。
关于你的第二个问题:但是当我尝试从定时器中断服务例程或操作系统任务访问它时,核心 0 会发生硬故障。
您可以尝试追溯硬故障。在 HardFault_Handler() 中停止内核,并在内核寄存器中找到 SP 值:如何调试 ARM Cortex-M(V7M) MCU(S32K3XX) 上的故障异常。
此致,
朱利安
你好,
当我在 main() 中访问共享内存时,即使在断电重启后也能正常工作,但是当我尝试从定时器中断服务例程或操作系统任务中访问它时,核心 0 会发生硬故障。
请支持我。
你好@Julián_AragónM ,
请协助解答此问题。我到底漏掉了什么?
在不使用调试器的情况下,能否在 POR RESET 后通过 main() 函数访问共享内存?问题是否出在内存初始化上?
但是当我尝试从定时器中断服务例程或操作系统任务访问它时,核心 0 会发生硬故障。
您是否能够像我上次回复中提到的那样,确定故障类型?
您是否也确保将变量放置在不可缓存的区域中,或者禁用了缓存?
建议如下:
对 core1Status 保持 volatile 状态,并在读取(Core0)和写入(Core1)两侧使用__DMB()/__ DSB() 屏障。
您的问题也可能是由 MPU 配置引起的,如果定义了 MPU_ENABLE,请在任何 ISR 或 OS 任务开始执行之前调用 MPU 配置。
您可以参考以下链接: Arm Cortex-M7 设备通用用户指南 r1p2和AN14715:S32K3XX 硬件资源隔离和保护。
此致,
朱利安
你好@Julián_AragónM ,
谢谢你的回复。
很遗憾,我无法继续进行这项工作,我会仔细核查您提出的观点。