Cortex-R5平台memcmp偶发CPU停滞问题排查及源码查询求助
针对Cortex-R5平台memcmp停滞问题的解答
1. 如何获取Cortex-R5平台memcmp的源码?
你使用的armr5-none-eabi-gcc工具链配套的C标准库通常是newlib(嵌入式场景下的常用轻量标准库),可以通过以下途径找到memcmp的实现:
- 直接获取newlib的开源源码,memcmp的基础C语言实现一般在
newlib/libc/string/memcmp.c路径下;针对ARM架构的汇编优化版本(专门适配Cortex-R5指令集的实现),会放在newlib/libc/machine/arm/目录下,文件名通常为memcmp.S。 - 如果你的工具链是Xilinx SDK提供的定制版本,Xilinx会在SDK安装目录中附带标准库的源码包,或者提供源码下载入口,你可以在工具链的
lib或src相关子目录中查找。 - 也可以用工具链自带的
armr5-none-eabi-objdump或armr5-none-eabi-nm工具,分析你的可执行文件,确认memcmp符号来自哪个库文件,再针对性地查找对应库的源码。
2. 导致memcmp CPU停滞的可能原因
结合你已经做的排查(打印值正常、自定义函数无问题、仅第一个memcmp停滞),大概率是以下原因之一:
- 内存缓存一致性问题:Cortex-R5支持数据缓存,如果你的硬件随机数模块是直接通过DMA或外设总线写入
bytes1/bytes2所在内存,而该内存区域的缓存属性配置不当(比如未设置为“可缓存且写回”,或者硬件写入后未触发缓存刷新),可能导致memcmp访问的是缓存中的旧数据,而硬件写入的新数据未同步到缓存。不过你能正常打印出正确值,说明printf调用时可能触发了缓存刷新,但memcmp调用前没有,这种情况下memcmp的比较逻辑可能进入异常循环。另外,如果内存被标记为设备内存(而非正常可缓存内存),memcmp的汇编优化指令(比如批量加载)可能会导致总线挂起。 - 内存对齐问题:memcmp的汇编优化实现通常会假设输入指针是按特定字节对齐的(比如4字节或8字节),如果你的
bytes1/bytes2数组被编译器分配到非对齐地址,某些ARM指令(比如LDM批量加载、LDREX独占访问指令)在访问非对齐地址时会触发总线错误,进而导致CPU停滞(而非直接崩溃)。 - 标准库汇编实现的bug:针对Cortex-R5的memcmp汇编优化版本可能存在逻辑bug,当比较的两个内存块在早期字节就出现差异时,触发了无限循环。你提到“仅此处因预期比较值不同出现问题”,而其他场景下memcmp正常,这非常符合这类bug的特征——相等比较时逻辑能正确退出,而不等时的分支处理出错。
- 硬件总线死锁:随机数硬件模块完成写入后,总线状态未正确恢复,导致CPU在通过memcmp访问该内存区域时,总线处于挂起状态,CPU一直等待总线响应,表现为停滞。这种情况下,自定义函数的逐字节访问可能不会触发总线死锁,而memcmp的批量访问指令会触发。
临时解决建议
既然自定义比较函数能正常工作,你可以先替换memcmp为自定义实现;同时可以尝试:
- 检查
bytes1/bytes2数组的内存对齐情况,通过__attribute__((aligned(4)))强制指定对齐方式; - 手动添加缓存刷新指令(比如ARM架构的
DMB/DSB指令,或GCC内置函数__builtin___clear_cache),在硬件写入随机数后、调用memcmp前执行; - 升级
armr5-none-eabi-gcc工具链版本,看是否修复了标准库的相关bug。
内容的提问来源于stack exchange,提问作者Floha
相关产品推荐
相关产品推荐

