先楫半导体HPMicro
直播中

jf_76924617

1年用户 15经验值
擅长:嵌入式技术
私信 关注
[问答]

memcpy耗时不稳定问题,win11,SES环境

开发板是6360evk,环境是win11,ses 7.32.

memcpy耗时一会2.5us,一会8.5us,这是怎么回事?
for loop的话就是稳定的8.5us左右,

a59b40d3238e4311bd6f80e053367f6.png

fc6115f21e9d9ad2ef92195c99fcb70.png

完整函数如下,是一个通过网口发送数据的函数。

image.png

尝试修改变量定义,修改代码存放位置,都无法改善。
ATTR_PLACE_AT_NONCACHEABLE __RW enet_desc_t desc;

image.png

回帖(2)

爱与友人

2023-10-16 10:07:39
可能的原因是由于memcpy操作受到缓存的影响,使用缓存时会遇到缓存命中和缓存不命中的情况,从而导致memcpy操作的耗时不稳定。

尝试取消缓存,将变量定义为非缓存类型,即使用ATTR_PLACE_AT_NONCACHEABLE __RW关键字,可以解决这个问题。

此外,也可以尝试在代码中使用CPU屏障来保证内存操作的顺序性和可见性,进一步提高程序的稳定性和可靠性。
1 举报
  • jf_76924617: ATTR_PLACE_AT_NONCACHEABLE __RW  尝试过了,没有效果,请问CPU屏障 具体怎么在代码里实现? 有相关例程可以参考吗?

zhangengui

2023-10-18 09:59:06
1.memcpy拷贝,目标地址和源地址如果均是4字节对齐的,会按照4字节对齐拷贝。如果不是按照4字节对齐的,会变成单字节拷贝,速度会变慢,理论速度会慢4倍。请确保dest_ptr和data地址是4字节对齐。如果memcpy拷贝速度不稳定,有可能是地址不对齐导致,也有可能是cache未命中造成。可尝试用两个4字节对齐的buf拷贝验证。
2.如果要提升memcpy速率,可尝试将目标地址和源地址均放到ILM/DLM区,该内存区域CPU访问是0等待的。
可如下定义:ATTR_RAMFUNC_WITH_ALIGNMENT(4) uint8_t dest_buff[1024];
1 举报
  • jf_76924617: 我已将项目的Code Section 设置为.fast , 应该都放入的DLM区域,但还是没有改善效果。

更多回帖

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