arm地址对齐的总结

static void axi_azx_writeb(u8 value, u8 __iomem *addr)

{

u32 data;

u32 offset;

offset = (u64)addr & 0x03; // 编译器不允许地址做& 操作时要强转为数据

addr = (u8 __iomem *)((u64)addr & 0xFFFFFFFFFFFFFFFC); // __iomem是个64位的地址 u8表示从这个地址取8位的数据(编译器是这么解释的)

data = readl(addr); //readl会把读到的数据强转为32位

//根据偏移写数据

data &= ~(0xFF << offset * BYTE_BIT_WIDTH);

data |= (value << offset * BYTE_BIT_WIDTH);

writel(data, addr);

}

地址对齐是规定(这个对齐不是c语言结构体的对齐) arm x86都需要,只不过看硬件来做还是软件来做,硬件做成本大一些

arm手册说指令对齐 实际上就是指令的地址对齐,如果硬件不对齐,软件也不做,cpu执行指令就会错

编译器会把单个变量做地址对齐

寄存器读写一般都是32位数据操作,小于32位(单、双字节对齐)的话都是先读写32

C语言定义一个变量int c 编译器会4字节对齐 如果定义8字节的变量就8字节对齐

相关推荐
忆和熙18 小时前
ARM Load/Store指令、伪指令(ARM处理器指令系统——ARM指令集初学,下篇)
arm开发·arm指令
忆和熙19 小时前
ARM数据处理指令(ARM处理器指令系统——ARM指令集初学,上篇)
arm开发·arm指令
EnglishJun20 小时前
ARM嵌入式学习(一) --- 入门51
arm开发·学习
路溪非溪2 天前
systemd简介和使用总结
linux·arm开发·驱动开发
想要成为计算机高手2 天前
研究 telegrip - SO100 Robot Arm Teleoperation System
arm开发·机器人·开源·具身智能·摇操·telegrip
编码如写诗2 天前
【k8s】arm架构从零开始在线/离线部署k8s1.34.5+KubeSphere3.4.1
arm开发·架构·kubernetes
EVERSPIN2 天前
BLE蓝牙水表蓝牙芯片方案
arm开发·蓝牙芯片·蓝牙芯片方案
银河麒麟操作系统2 天前
银河麒麟桌面操作系统V10SP1(全X86/ARM架构)【进程资源限制与性能优化实践】技术文章
arm开发·性能优化·架构
左手の明天3 天前
Linux内核裁剪深入浅出:从原理到实操,打造轻量化嵌入式内核
linux·arm开发·c++
路溪非溪3 天前
wpa_supplicant核心操作总结
linux·网络·arm开发·驱动开发