Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
内存对齐_align
内存对齐_align
内存非对齐访问问题的研究
1.00
发布于 2021-03-25 14:25:11 浏览:1671
订阅该版
[tocm] # 内存非对齐访问问题的研究 在代码调试的过程中,偶尔会遇到由于内存非对齐访问导致的错误,下面用一些例子来说明非对齐访问错误产生的原因,以及如何解决非对齐访问错误。 ## 示例一 ``` -munaligned-access -mno-unaligned-access Enables (or disables) reading and writing of 16- and 32- bit values from addresses that are not 16- or 32- bit aligned. By default unaligned access is238 Using the GNU Compiler Collection (GCC) disabled for all pre-ARMv6, all ARMv6-M and for ARMv8-M Baseline architectures, and enabled for all other architectures. If unaligned access is not enabled then words in packed data structures are accessed a byte at a time. The ARM attribute Tag_CPU_unaligned_access is set in the generated object file to either true or false, depending upon the setting of this option. If unaligned access is enabled then the preprocessor symbol __ARM_FEATURE_UNALIGNED is also defned. ``` 系统中的结构体数据,如果添加了 `__packed` 属性,则会以紧凑的方式进行内存排布,此时其中的一些数据在内存中的排布就是非对齐的。在程序运行时,如果系统不允许非对齐访问,此时对该结构体中的非对齐数据进行访问,则会出现 data abort 的错误。 如果在编译和链接时添加 `-mno-unaligned-access` 不支持非对齐内存访问选项,将会告诉编译器,生成操作这些非对齐数据指令,需要一个字节一个字节地读取,然后将结果拼凑成最终的数据。用这种方式操作数据降低了数据的访问效率,但是可以避免出现非对齐访问错误。 在 armv7 中可以开启或者关闭非对齐访问检查,例如使用如下指令关闭非对齐访问检查: ``` /* disable the data alignment check */ mrc p15, 0, r1, c1, c0, 0 bic r1, #(1<<1) mcr p15, 0, r1, c1, c0, 0 ``` 如果关闭了非对齐访问检查,此时 CPU 访问非对齐数据将不会报错,在底层硬件实现时,可能会将一次访问拆成多次对齐访问来实现,但是在软件层是不感知的。尽管如此,还是降低了数据的访问效率。另外,一些**强序内存**(例如设备内存)是不支持非对齐访问的。 ### 非对齐访问参数测试 编译如下源码: ``` struct st_a { char a; int b; } __attribute__((packed)); int get_b(struct st_a *p) { return p->b; } ``` 编译命令如下: - 支持非对齐访问 ``` arm-none-eabi-gcc.exe -S arm.c -o arm_with_unaligned_access.s -O2 -mcpu=cortex-a7 ``` - 不支持非对齐访问 ``` arm-none-eabi-gcc.exe -S arm.c -o arm_no_unaligned_access.s -O2 -mno-unaligned-access -mcpu=cortex-a7 ``` 实验结果如下: ![1598435852830.png](https://oss-club.rt-thread.org/uploads/20210325/2fa5304f1c27502d5961960e9c1335be.png) ![1598435867798.png](https://oss-club.rt-thread.org/uploads/20210325/ac81b6d1e580c94f2e79aa69128a47b9.png) 可以清楚地在汇编在代码中看到,如果开启了禁止非对齐访问,在操作非对齐地址的数据时,读取了多次,每次只读取一个字节。 ### 结论 如果系统中出现了非对齐访问错误,则要从两方面入手检查: 1. cpu 是否开启了非对齐访问检查,如果开启了该检查,那么出现非对齐访问就会出现 data abort。 2. 编译时,是否告知编译器帮忙处理非对齐访问的问题,如果告诉编译器,目标机器不允许非对齐访问,那么编译器发现将要访问非对齐的地址时,会执行单字节的访问指令,进而避免非对齐访问错误。 ## 示例二 C lib 库中的 `memcpy` 函数的行为与 rt-thread 中 `rt_memcpy` 不一致,可能导致的非对齐访问错误,该问题最早出现在基于 `sdio` 的存储器的文件系统的读写过程中。 该问题是由于使用了 C lib 库中的 `memcpy` 函数导致的硬件错误,如果使用 RT-Thread 提供的 `rt_memcpy`,该函数会判断源地址和目标地址是否为四字节对齐,如果不是,那么将会尝试使用单字节的方式进行数据拷贝,这样做避免出现非对齐访问错误。 ## 结论 对于 SDIO 驱动而言,其传输所使用的内存地址是否支持非对齐,是要仔细考虑的地方,这里可能需要后续继续完善。我感觉这样修改没能从根本上解决驱动的问题,而只是避过了驱动程序中可能出现的错误。 如果以兼容性为先,那么可以使用 `rt_memcpy` 来代替 C 库中的 `memcpy` 函数,这种系统将默认处理非对齐的问题,但是使用单字节拷贝的情况会降低系统的效率,这点在后期系统优化的过程中应该需要重新考虑和完善。
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
我夏了夏天
Life isn't about finding yourself, life is about creating yourself.
文章
24
回答
1319
被采纳
19
关注TA
发私信
相关文章
1
studio 字节对齐问题求解
2
ALIGN(RT_ALIGN_SIZE)问题
3
线程中对double赋值会引起 UNALIGNED ?
4
SCB_CFSR_UFSR:0x100 UNALIGNED问题
5
程序75行一赋值就挂掉,不知什么原因
6
stm32h7 非对齐访问出现HardFault
7
字节对齐 ALIGN(RT_ALIGN_SIZE)的用法
8
函数地址指针赋值问题
9
给float指针赋值引发 UNALIGNED 错误,请教原因与优化手段
10
AC6优化等级-OZ后,触发错误中断,错误原因:企图执行非对齐访问,如何解决?
推荐文章
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组件
热门标签
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
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部