stm32的变量定义,32b是不是效率更高?

2019-12-28 17:49发布

如题,如果工作再32位模式,是不是32位最好,8位或者16位在读取的时候还要增加移位和对齐操作。

Thumb模式呢?

懂编译器和熟悉ARM的出来说说,主要是M3,乘除法效率方面。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
takashiki
1楼-- · 2019-12-29 12:26
对于M3来说:

1、M3没有ARM模式,只有Thumb2模式。
2、基本上,在对齐访问模式下,32b访问效率最高,但是LDR等指令相对于8b、16b来说是一样的,因为有专用的指令LDRB、LDRH之类。算数、逻辑运算等等只有32位的操作进行8b、16b运算需要额外的操作而降低效率,但是一般编译器优化之后降低得并不明显。在非对齐访问模式下,32位访问效率比较低,非对齐模式下8位访问效率是最高的,16b、32b需要额外的时钟周期来拼接。因此,__packed关键字是会降低效率的。
gmyu
2楼-- · 2019-12-29 13:16
takashiki 发表于 2017-5-15 14:23
对于M3来说:

1、M3没有ARM模式,只有Thumb2模式。

不知道是不是编译器已经帮我们考虑了对齐和存取的问题。
bias
3楼-- · 2019-12-29 18:02
 精彩回答 2  元偷偷看……
myxiaonia
4楼-- · 2019-12-29 18:51
wye11083 发表于 2017-5-15 12:17
错也。对这类RISC内核,所有操作都是基于32位的——它里面根本没有16位/8位流水线单元!有符号数LD时做符 ...

我所谓的多干的活是指令内部干的活,比如ldrb,其实内部是用ldr获得32位值,然后位屏蔽并选择对应位置的字节,这些操作确实是1个指令就可以完成的,很明显比ldr干的活多嘛

然后乘除运算,我特意去看了下cm3的指令集,乘法倒倒还好,基本上8、16、32位运算都是有对应指令的,但是除法就没有那么幸运了
takashiki
5楼-- · 2019-12-30 00:33
gmyu 发表于 2017-5-15 17:30
不知道是不是编译器已经帮我们考虑了对齐和存取的问题。

不知道呢,我认为编译器应该会尽可能的考虑对齐问题,但是人为的折腾他就没办法了。比如指针强制转换 *(int*) 0x20000001这样的代码。
gonboy
6楼-- · 2019-12-30 04:20
如果不是要求特别严格的地方。完全可以忽略掉差异。

有时不要为了很少的效率,特定将char改成int. 反而可能降低可读性和维护性。

一周热门 更多>