ARM Cortex M0,字节或字访问,哪一个是最好的?

ARM Cortex M0,字节或字访问,哪一个是最好的?,c,arm,C,Arm,在Cortex M0+上使用字节访问(而不是word)的真正好处是什么。 LPC845的所有封装引脚(GPIO)都有一个“字节”寄存器和一个“字”寄存器 如果我想使用字寄存器设置GPIO,我会使用这样的东西 *((volatile uint32_t*)0xA0001088) = 1; 0000036e: movs r4, #137 ; 0x89 00000370: ldr r0, [pc, #80] ; (0x3c4 <AppInit+144>

在Cortex M0+上使用字节访问(而不是word)的真正好处是什么。 LPC845的所有封装引脚(GPIO)都有一个“字节”寄存器和一个“字”寄存器

如果我想使用字寄存器设置GPIO,我会使用这样的东西

*((volatile uint32_t*)0xA0001088) = 1;

0000036e:   movs    r4, #137        ; 0x89
00000370:   ldr     r0, [pc, #80]   ; (0x3c4 <AppInit+144>)
00000372:   str     r4, [r0, #0]
*((易失性uint32_t*)0xA0001088)=1;
0000036e:MOVSR4,#137;0x89
00000370:ldr r0,[pc,#80];(0x3c4)
00000372:STRR4[r0,#0]
同时,我可以使用字节寄存器 (使用此选项,GPIO外围设备将自动忽略超过0xFF的所有内容,并将1写入引脚)

*((易失性uint8_t*)0xA000102C)=1;
0000039c:ldr r3,[pc,#48];(0x3d0)
0000039e:加上r1,#56;0x38
000003a0:strb r1[r3,#0]
现在这两种技术都使用相同数量的指令


哪一个最适合使用?为什么?

ARM Cortex-M0是32位处理器,32位访问是它的“自然”访问(只要对齐)。因此,尽管看起来指令的数量相同,但对于非32位对齐的访问,硬件要做更多的工作。这也是我的理解。但令人好奇的是,为什么NXP实现字节访问来做完全相同的事情。可能有不同的循环(由于管道?)您的C代码和汇编语言不匹配。请提供足够的代码来演示您的示例和程序集与C匹配的代码。对不起,从Eclipse获取此信息时,我出现了复制粘贴错误(现在已修复为uint8_t)。您正在向寄存器写入1,但汇编语言正在写入0x89和0x38。这两个值都不等于0x01
*((volatile uint8_t*)0xA000102C) = 1;

0000039c:   ldr     r3, [pc, #48]   ; (0x3d0 <AppInit+156>)
0000039e:   adds    r1, #56 ; 0x38
000003a0:   strb    r1, [r3, #0]