Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
rt_memcpy
memcpy aeabi_memcpy aeabi_memcpy4 问题
发布于 2022-04-06 11:36:39 浏览:2384
订阅该版
在移植一个某个程序时,以前平台(arm Cortex-M3)运行得很好的程序,突然到新的平台(arm Cortex-M7)突然出现hard fault 了 ``` FPU active! usage fault: SCB_CFSR_UFSR:0x100 UNALIGNED ``` 这种错误,我通过cpu pc寄存器值和map文件定位到了在 memcpy 函数中,猜测应该是复制数据时地址未对齐引起的。 我开始以为 memcpy 就是 rt_memcpy ,所以把 rt_memcpy 函数的4字节对齐复制变成单字节复制,发现问题依然存在。 然后我通过搜索map文件发现,很多软件包并没有使用rt_memcpy ,而是使用编译器提供的 memcpy 。即使 我通过下面这样的代码,想把memcpy重定向到 rt_memcpy依然没有丝毫效果。 ```c void *memset(void *src, int c, size_t n) { return rt_memset(src, c, n); } void *memcpy(void *dest, const void *src, size_t n) { return rt_memcpy(dest, src, n); } ``` 然后我在map文件中发现一些函数,部分map文件内容 ```c ntp.o(i.ntp_get_time) refers to rt_memcpy_w.o(.text) for __aeabi_memcpy4 ntp.o(i.ntp_get_time) refers to rt_memclr_w.o(.text) for __aeabi_memclr4 rt_memcpy_v6.o(.text) refers to rt_memcpy_w.o(.text) for __aeabi_memcpy4 rt_memmove_v6.o(.text) refers to rt_memcpy_v6.o(.text) for __aeabi_memcpy rt_memmove_v6.o(.text) refers to rt_memmove_w.o(.text) for __memmove_aligned aeabi_memset.o(.text) refers to rt_memclr.o(.text) for _memset rt_memclr.o(.text) refers to rt_memclr_w.o(.text) for _memset_w strncpy.o(.text) refers to rt_memclr.o(.text) for __aeabi_memclr ``` 我才发现原来memcpy并不是直接使用调用的,编译器还分了单字节复制和4字节复制的方式 rt_memcpy_v6 rt_memcpy_w aeabi_memcpy aeabi_memcpy4 然后我再次重新定义 ```c void __aeabi_memcpy(void *dest, const void *src, size_t n) { rt_memcpy(dest, src, n); } void __aeabi_memcpy4(void *dest, const void *src, size_t n) { rt_memcpy(dest, src, n); } ``` 再一编译发现问题消失了。 也有查找网上资料说 使用 `#pragma pack(1)` 将变量设置成单字节对齐,这样使用`memcpy`时就会调用`__aeabi_memcpy4`而是使用 `__aeabi_memcpy`函数 不知道大家有没有更好的办法,能使memcpy完全使用rt_memcpy
查看更多
5
个回答
默认排序
按发布时间排序
李肯陪你玩赚嵌入式
认证专家
2022-04-06
2022年度和2023年度RT-Thread社区优秀开源布道师,COC深圳城市开发者社区主理人,专注于嵌入式物联网的架构设计
要想把memcpy替换成rt_memcpy可以尝试下在GCC链接阶段动手脚。 参考我的一篇文章:[替换标准C库的rand函数](https://blog.csdn.net/szullc/article/details/123193290) 5.1章节。 用到GCC的一个链接选项: -Wl,--wrap=xxx
mysterywolf
认证专家
2022-04-06
https://github.com/mysterywolf
千万别乱用memcpy,这玩意是上来就四字节拷贝的,不判断内存对齐,平时没啥事,一旦死机哭都没有地方哭。rt_memcpy 是安全的。 可以用全局宏来进行替换
aozima
2022-04-06
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
没有太好的办法。 为了性能,编译器提供的方案稍微激进了一些,本来是没问题的,只要不任意强转就不会有事。(向上对齐强转的代码本身就是不推荐,甚至是错误的用法) 但是有些代码违规强转,就会引发异常。 比如`void*`你强转成`int *`,编译器就认为你是4字节对齐了,就可以使用更高效的对齐拷贝。 如果你转成`double`,就更不得了,直接就使用多字拷贝了。 毕竟性能有几十倍的差距。 或是外扩的RAM并不支持非对齐访问,或是多字连续访问。也会出现问题。 常见的有MCU级别的外扩SDRAM,很多不支持多字访问。 SPI接口的PSRAM映射的外扩内存也是重灾区。 都不用行不行?程序员觉得可以,BOSS说不行,比如同样的芯片跑UI,别人跑几十帧,你跑几帧,你选择哪个呢? 但问题又客观存在。 如果想稳妥,只能像你这样修改。 或是对目标地址对齐,或是地址范围,做个判断。 我的想法是, - 通用的API还是不必全部修改。总归改不完。 - 然后默认可以把工具链相对激进的memcpy优化给拦截掉。 - 有性能要求的项目,可以根据源地址和目标地址是否对齐,以及本项目芯片外扩RAM是否支持对齐多字访问。自动调用不同的实现。
bernard
2022-04-06
这家伙很懒,什么也没写!
感觉是要被你们玩坏了,都觉得rt_memcpy好用,rt_memset好用…… 但是啊,在能够不用rt_memcpy的情况下就尽量不要用 😜
HAHABO
2023-05-08
这家伙很懒,什么也没写!
``` Date: Sat, 14 Jan 2023 20:21:06 +0800 Subject: [PATCH 01/45] do not use memcpy in musl libc --- kernel/rt-thread/src/kservice.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/rt-thread/src/kservice.c b/kernel/rt-thread/src/kservice.c index a441082..b1c61d3 100644 --- a/kernel/rt-thread/src/kservice.c +++ b/kernel/rt-thread/src/kservice.c @@ -1574,7 +1574,7 @@ void rt_assert_handler(const char *ex_string, const char *func, rt_size_t line) RTM_EXPORT(rt_assert_handler); #endif /* RT_DEBUG */ -#if !defined (RT_USING_NEWLIB) && defined (RT_USING_MINILIBC) && defined (__GNUC__) +#if !defined (RT_USING_NEWLIB) && (defined (RT_USING_MINILIBC) || defined(RT_USING_MUSL)) && defined (__GNUC__) #include
void *memcpy(void *dest, const void *src, size_t n) __attribute__((weak, alias("rt_memcpy"))); void *memset(void *s, int c, size_t n) __attribute__((weak, alias("rt_memset"))); -- ```
撰写答案
登录
注册新账号
关注者
0
被浏览
2.4k
关于作者
文武斌
这家伙很懒,什么也没写!
提问
27
回答
74
被采纳
2
关注TA
发私信
相关问题
1
rt_memcpy拷贝出错,必须强制(void*)转换才可以
2
kservice.c中为什么重新实现了C库的一部分函数?
3
rt_memcpy拷贝出现问题,强制类型转换也没有效果。
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
a1012112796
13
个答案
1
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部