打印

关于ARM位指令效率不如MCU位指令效率的革命道理

[复制链接]
7885|50
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hotpower|  楼主 | 2011-11-24 08:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hotpower 于 2011-11-30 00:43 编辑




M0 GPIO用库和寄存器方式控制IO翻转速度对比,速度差近12倍!

M0有人说差的要死,我不信,偏偏用M0来玩,M0相当给力!AVR准备停用之.........
plc_avr 发表于 2011-11-24 06:18


实际ARM的指令集已经决定了它操控GPIO显然远不如MCU,因为MCU指令中已经多方考虑了对GPIO的位操作。

而ARM是通用的MCU,例如其核,NXP有M0,Nuvoton有M0,可能还有其他的M0.
那么这些厂家的M0的GPIO物理地址的分配不可能一样,故指令中不可能对GPIO进行操作,特别是位操作。

可能从汇编语言中看出,MCU可以对位操作,但是C语言实际没有真正意义的位操作。
而我们用的MCU开发平台由于是针对某些芯片的,故编译器可以识别出实现约定好的位操作。


再可以从红杏上看出,它由结构、联合、位域及枚举组成,我们需要的位操作实际是用位域替代的,是寄存器的&=~,|=等“位”操作。

故红杏在一般MCU上应用显然要效率低下,而在ARM上使用,由于通用性不支持真正的位,故红杏的效率将和理论分析的一样,即对ARM的访问,红杏的架构是最正确的。
所以可以看出在ARM用结构来描述特殊寄存器阵列是很好甚至是最好的选择。

但是由于ARM是32位的,但指令可能是16位或32位的,故32位/16位指令集中不可能包含寄存器的32位地址或立即数。所以必须通过间接寻址即指针来访问。

故特殊寄存器的物理地址必须在指令语句的附近存放,即所谓的“文字池”。

所以ARM要想操作GPIO的一位,必须做工作:
1. 在附近的文字池中取出GPIO地址,如GPIOA
2. 得到某控制寄存器,如GPIOA.xxx
3. 对GPIOA.xxx进行“位操作”,如&=~或|=

故ARM操作GPIO指令效率肯定不如MCU,这是天生的而非某厂家的不足。

新唐为了提高其访问GPIO的效率,简化了俺说的上述3条基本步骤,用寄存器替代位。
即用空间换速度。一个位就占用一个寄存器地址。
即一个GPIO的位将占用32位的ARM寄存器地址。

ARM快速操作GPIO的一位,必须改进工作:
1. 在附近的文字池中取出GPIO地址,如GPIOA
2. 得到某控制寄存器为某位,如GPIOA.bitxxx

特别注意标题的“指令效率”,假若在应用ARM远比MCU主频快,那么运行效率可能比MCU要快。

注意“指令效率”和“运行效率”的不同。前者菜农阐述了ARM通用带来的低下,后者倍频换取了提高。
例如MCU的主频(指令周期)一般在几兆以内,而ARM一般可以倍频到几十兆。
MCU访问一般需要一条指令几个指令周期,而ARM指令效率低下需要多条指令,但是由于速度快运行可能远远超过MCU。
特别注意,当ARM连续访问GPIO某寄存器的不同位时,由于只需在第1次访问时从文字池取寄存器地址外,编译器将会优化后面的连续访问,即不再需要在文字池取地址,
故访问速度要加快。即访问位的速度是不一样的。

大家可以看到:
MCU控制GPIO只需要一条指令几个字节(操作码+操作数)
ARM需要折腾半天才得到控制寄存器物理地址。

相关帖子

沙发
Ryanhsiung| | 2011-11-24 08:14 | 只看该作者
这个知道。 坐沙发
关于 “M0 GPIO用库和寄存器方式控制IO翻转速度对比,速度差近12倍! ”
若想用库函数有闲太慢的朋友们,可以自己添加一些I0口底层库函数,并且将函数定义__inline内联,
这样库的操作速度就不会比寄存器操作慢了

使用特权

评论回复
板凳
xyz769| | 2011-11-24 08:33 | 只看该作者
ARM?? MCU??? 楼主的MCU是单指某一类MCU,如51类MCU,不含ARM类MCU吧?

 另:楼主的结贴率也为0,也不喜欢结贴啊。。:D

使用特权

评论回复
地板
DownCloud| | 2011-11-24 08:39 | 只看该作者
额,这样啊,菜鸟都是直接调用库的才不管速度,哈哈。

使用特权

评论回复
5
ayb_ice| | 2011-11-24 08:46 | 只看该作者
本帖最后由 ayb_ice 于 2011-11-24 08:47 编辑

这东西看看汇编指令就知道区别区巨大了,与单周期51的速度,指令长度都有巨大差距,更不方便的还有对IO操作不是原子操作,非常不爽

使用特权

评论回复
6
yhn1973| | 2011-11-24 08:57 | 只看该作者
M3核也有强大的位操作指令,M0核本就是阉割版的

使用特权

评论回复
7
baiyunfei.k.f| | 2011-11-24 09:17 | 只看该作者
是啊,M3核是支持位操作的

使用特权

评论回复
8
hotpower|  楼主 | 2011-11-24 09:37 | 只看该作者
实际M3的位指令也不是有一条指令完成的。
和MCU是有区别的。

使用特权

评论回复
9
plc_avr| | 2011-11-24 09:57 | 只看该作者
顶起来。。。

使用特权

评论回复
10
ayb_ice| | 2011-11-24 10:40 | 只看该作者
是啊,M3核是支持位操作的
baiyunfei.k.f 发表于 2011-11-24 09:17

那个也要先加载地址的,相比ARM7有些进步,与51还是有相当差距

使用特权

评论回复
11
highgear| | 2011-11-24 10:58 | 只看该作者
这种比较意义不大。

使用特权

评论回复
12
Cortex-M0| | 2011-11-24 11:22 | 只看该作者
呵呵~~~

论效率,1位机对I/O口的操作效率最高,指令代码最短。

32位机本身对32位数据处理效率最高,由于ARM的指令集带16位子集,所有对16位数据处理的效率也高,只是对1位I/O口的操作离32位太远,要效率高,所花的代价太大,要单独插入精简位处理指令集。

使用特权

评论回复
13
ayb_ice| | 2011-11-24 13:00 | 只看该作者
呵呵~~~

论效率,1位机对I/O口的操作效率最高,指令代码最短。

32位机本身对32位数据处理效率最高,由于ARM的指令集带16位子集,所有对16位数据处理的效率也高,只是对1位I/O口的操作离32位太远,要效率高,所花的 ...
Cortex-M0 发表于 2011-11-24 11:22

这个说法也不准确
很多32位机都可以直接寻址,
FREESCALE的冷火就可以

使用特权

评论回复
14
Cortex-M0| | 2011-11-24 13:09 | 只看该作者
就算可以直接寻址,但代码也超级长,哪有1位机短小精干?

因此,无可争议,多少位机处理多少位数据,效率和代码长度都是最优的。

使用特权

评论回复
15
nongfuxu| | 2011-11-24 19:43 | 只看该作者
路过看看啦

使用特权

评论回复
16
hotpower|  楼主 | 2011-11-24 20:10 | 只看该作者
这个说法也不准确
很多32位机都可以直接寻址,
FREESCALE的冷火就可以
ayb_ice 发表于 2011-11-24 13:00


最主要的是ARM是个贩子不是厂家,故只能做成通用的模糊设计。
谁买他的核自己定义。故ARM不可能有最佳的位操作指令。

使用特权

评论回复
17
watch186| | 2011-11-24 20:31 | 只看该作者
分析的很到位   是需要仔细研读的**

使用特权

评论回复
18
流行音乐| | 2011-11-25 00:01 | 只看该作者
Cortex-M3 的 bit-banding 就是一条指令完成的,虽然有可能是多周期指令,但是是百分之百的原子操作。
而且即便是多周期指令,顶多也就 2、3 个周期而已,以 STM32 的 72MHz 的速度来说,也有 24MHz 的 IO 速度,完全足够用了。

使用特权

评论回复
19
流行音乐| | 2011-11-25 00:09 | 只看该作者
如果 bit-banding 不访问系统总线,bit-banding 可以和 CPU 并行执行:
The processor does not stall during bit-band operations unless it attempts to access the
System bus while the bit-band operation is being carried out.

使用特权

评论回复
20
areshan| | 2011-11-25 00:14 | 只看该作者
ARM的IO口操作的汇编指令要好几条,如果ARM和单片机都跑12M,不知道ARM要慢多少!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:[url=http://www.21ic.com/tools/HotWC3_V1.23.html]

1460

主题

21619

帖子

506

粉丝