Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
arm
内存对齐_align
关于 ARM 架构下的非对齐访问
发布于 2020-08-27 16:12:50 浏览:2894
订阅该版
[tocm] # 关于 ARM 架构下的非对齐访问编译选项说明 ``` -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](/uploads/20200827/2fa5304f1c27502d5961960e9c1335be.png) ![1598435867798.png](/uploads/20200827/ac81b6d1e580c94f2e79aa69128a47b9.png) 可以清楚地在汇编在代码中看到,如果开启了禁止非对齐访问,在操作非对齐地址的数据时,读取了多次,每次只读取一个字节。
5
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
我夏了夏天
Life isn't about finding yourself, life is about creating yourself.
文章
24
回答
1319
被采纳
19
关注TA
发私信
相关文章
1
关于dlmodule的relocation问题
2
复旦微Z7芯片支持问题
3
RTT Cortex R5的移植有谁弄过没?
4
RT-Thread/S3C4510
5
【求助】app能否调用bootloader中的部分文件
6
RT thread支持Arm China Star-SE架构?
7
studio 字节对齐问题求解
8
ALIGN(RT_ALIGN_SIZE)问题
9
线程中对double赋值会引起 UNALIGNED ?
10
SCB_CFSR_UFSR:0x100 UNALIGNED问题
推荐文章
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
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
20
个答案
2
次被采纳
张世争
11
个答案
2
次被采纳
rv666
9
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部