kation122 发表于 2015-4-5 13:29:47

大比拼!AVR-STM8-R8C IO 操作对比.

本帖最后由 kation122 于 2015-4-5 13:31 编辑

        最近想将LGT8F88D用在一个项目上, 初接触到AVR ,所以初步研究了一下AVR ,以前看到很多大侠说AVR 非常好用,
但是我个人自己的感觉,用起来不是很顺手,就拿IO 操作来说,之前用到的MCU 都是可以直接bit 操作的,比如 用瑞萨的 R8C
#define LED_R   p1_0之后就可以直接用了 , 这样 LED_R =1;IO 就输出高了,很直接、很方便, STM8S 也可以直接bit 操作。
但是AVR 好像这样用不了,在IAR 中,仿照R8C 的头文件,用位域的方法,定义可以位操作的IO ,但是擦看汇编一看,吓一跳,并没有用SBI ,CBI 这样的指令,
而是用 了 类似读-写-改的操作来实现的,这样效率也太低了吧,将编译器优化等级调到最高,结果还是一样,网上查了一下,原来是“SBI和CBI指令只能对$00-$1F的I/O寄存器”,
但是8F328 的IO 是从0X25 开始的,所以SBI CBI 指令用不了,是不是这个原因呢?请大侠指点。

1、R8C 的IO 设置和操作,可以看到,设置IO DDR 、设置输出值,都是一条 BSET 就搞定了




2、STM8S 的IO 设置和操作,可以看到,同样的一条位指令就OK ,比如设置IO 为低,BRES 就OK 。



3、AVR 的IO 操作,汇编就比较复杂了。可以看到 设置IO 为输出 、设置IO 为低,都要5条指令才能完成。怎么差距会这么大呢。





PS: 使用的平台都统一是 IAR,优化等级都是最高

xiaoyigechaos 发表于 2015-4-5 13:46:05

CodeVisionAVR   可以直接操作位

mowin 发表于 2015-4-5 13:56:05

就是这样的

江南雨絮 发表于 2015-4-5 15:41:11

楼主可以试一下其它操作

zhanan 发表于 2015-4-5 17:45:52

本帖最后由 zhanan 于 2015-4-5 21:47 编辑

AVR 的IO 操作只有一部分是能位操作的,外设地址1F(RAM地址3F)以下才可以位操作。

毕竟是十几年前的产品了,stm8是现时代的产品。

LGT 发表于 2015-4-5 20:41:04

1.
楼主, 不是AVR的问题, 是你用的测试程序造成使用了读-改-写。
因为你使用的是Toggle, 这个操作一定要知道之前是什么, 才能决定之后输出, 所以一定会编译出读/改/写。

2.
AVR说地址00-0x1F可以用SBI/CBI, 这是是I/O地址, 如果换成内存映射地址,就是0x20~0x3F

3.
IAR的优化特性是最好的, 特别是针对AVR, 我们比较过同样的程序C51和AVR在相同配置下的编译,AVR要比C51小很多。

4.
下面的例子是直接给I/O复制产生SBI/CBI指令的代码, IAR此时选择是关闭任何优化。你可以试试。

kation122 发表于 2015-4-5 21:58:23

1

LGT 发表于 2015-4-5 20:41
1.
楼主, 不是AVR的问题, 是你用的测试程序造成使用了读-改-写。
因为你使用的是Toggle, 这个操作一定 ...

你好,谢谢指dian,从你这个代码来看,确实是可以位操作IO ,
我用的程序应该是和你的一样的。
DrvGPIO_EnableOutput(E, OUT4);//设置IO为输出
      
      DrvGPIO_ClearPort(E, OUT4) ;//IO输出0

就这两个语句,我估计是和IAR 版本有关,请问你用的IAR 是什么版本的呢,你这个测试程序方便打包上传上来吗。

kation122 发表于 2015-4-5 22:05:56

LGT 发表于 2015-4-5 20:41
1.
楼主, 不是AVR的问题, 是你用的测试程序造成使用了读-改-写。
因为你使用的是Toggle, 这个操作一定 ...

再次测试了,和神马Toggle 没关系,你操作PE 口,确实不能位操作。请看,如下图,PB、PC、PD 口都可以位操作,但是 PE口不行



LGT 发表于 2015-4-5 22:13:51

本帖最后由 LGT 于 2015-4-5 22:15 编辑

PE口是我们附加的,在AVR里是没有的,端口地址没有在位操作区域;你用其他口做toggle,产生不了一条指令的

kation122 发表于 2015-4-5 22:22:22

本帖最后由 kation122 于 2015-4-5 22:27 编辑

LGT 发表于 2015-4-5 22:13
PE口是我们附加的,在AVR里是没有的,端口地址没有在位操作区域;你用其他口做toggle,产生不了一条指令的 ...

toggle 肯定是一条指令实现不了,这个我知道呢,我上面测试的程序,也从来没有用到toggle 的功能,都是最简单 置高 置低。
还请教一下 下面的问题

1.
楼主, 不是AVR的问题, 是你用的测试程序造成使用了读-改-写。
因为你使用的是Toggle,

我1L 测试使用的程序就是这两个语句,请问哪里涉及到Toggle呢。

DrvGPIO_EnableOutput(E, OUT4);//设置IO为输出
         DrvGPIO_ClearPort(E, OUT4) ;//IO输出0

对应的汇编如下:

LGT 发表于 2015-4-5 22:37:00

上个帖子说了, PE这个口不是M328固有的, 是我们增加的, 地址分配在了非位寻址的区域,所以就不能编译出SBI/CBI指令了。
我说toggle是看到你最早的贴图用的是toggle函数。

kation122 发表于 2015-4-5 22:53:57

LGT 发表于 2015-4-5 22:37
上个帖子说了, PE这个口不是M328固有的, 是我们增加的, 地址分配在了非位寻址的区域,所以就不能编译出S ...

是的,这样问题就清楚,总结如下:
1、这个不是我测试程序的问题,因为我测试程序,确实没用到Toggle.
2、造成这个根本原因是这个 PE口是附加的,PE 口 的地址超出了 SBI CBI 的范围,所以不能使用不位操作。其他的PB PC PD 都是可以的。

秋夜木语 发表于 2015-4-5 23:14:40

这个还不错!

Gorgon_Meducer 发表于 2015-4-10 11:25:48

AVR比较新的型号,向PINx对应位写1可以实现TOGGLE功能。我记得好像Atmega48/88/168系列开始就有这个特性了。

zhanan 发表于 2015-4-10 11:42:35

这个?


位操作实际上是寻址的问题,AVR内核决定了只能IO地址在0x1F以下可以。再好的编译器也跳不出这个框框。

kation122 发表于 2015-4-10 11:50:05

zhanan 发表于 2015-4-10 11:42
这个?




是的,AVR 的位寻址能力相对R8C、STM8S 确实弱 , STM8S ,R8C 全部RAM 空间都可以位寻址。用位域来定义Flg 标志位,
对应的汇编就可以是位操作,很方便。

HYLG 发表于 2015-5-1 01:33:40

AVR的这个弱点LGT不能改变吗?

JAMESKING 发表于 2015-5-1 09:09:00

就工业应用而言,我不知道LGT的端口有没有保护二极管,但STM8全系列是确认了没有,AVR全系列是确认了有,过EMC的时候差别非常大,AVR最容易过,没有保护二极管的,耐受群脉冲能力都差很多。

chenxp99 发表于 2015-5-1 10:09:36

学习了引脚变化功能一直h没用过

wxtypeng 发表于 2015-5-1 14:55:50

IAR 的编译器优化不够?
页: [1]
查看完整版本: 大比拼!AVR-STM8-R8C IO 操作对比.