[菜农助学交流] M0 GPIO用库和寄存器方式控制IO翻转速度对比,速度差近12倍!

[复制链接]
 楼主| plc_avr 发表于 2011-11-5 08:17 | 显示全部楼层 |阅读模式
本帖最后由 plc_avr 于 2011-11-5 08:24 编辑

AVR的studio,软件仿真可以精确控制时间。因KEIL没有代码的执行时间预算,不知实际代码要多长时间,在时间要求高的场合非常重要。如果运算时间长了,其它的事就没法干了。做了个简单测试,在代码运行前置位一个IO,在运算的代码结束,清0这个IO,发现32位乘法运算要1us还要多。晕了,我主时钟开了50M的啊。不是单时钟周期乘法运算吗?后来看汇编文件,乘法运算只有一条指令,控制个IO要N条,我晕了。索性做IO输出0/1试验,结果出来了,50M时钟,用库只能达到1.0435M的翻转速度,还不如AVR,8M主时钟,IO翻转速度可以达到4M。这个效率真的太低了!后来用寄存器方式控制IO,结果一看令人相当震惊!达到了12M的速度。AVR不超频最快也只能达到8M,(16M时钟),看来得给AVR扔一边了。以后还是多用寄存器方式,呵呵。注意这个结果是在M0516芯片上测试的。
测试方法:用官方驱动库
  1. void main(void)
  2. {
  3. UNLOCKREG();
  4. DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);
  5. DrvSYS_SelectHCLKSource(0);
  6. //DrvSYS_Open(48000000); // 48MHz
  7. DrvSYS_Open(50000000);
  8. SystemCoreClockUpdate();
  9. delay_ms(100);
  10. LOCKREG();

  11. DrvGPIO_Open(E_PORT0, E_PIN5, E_IO_OUTPUT );
  12. while(1)
  13. {
  14. DrvGPIO_SetBit(E_PORT0,5);
  15. DrvGPIO_ClrBit(E_PORT0,5);
  16. DrvGPIO_SetBit(E_PORT0,5);
  17. DrvGPIO_ClrBit(E_PORT0,5);
  18. DrvGPIO_SetBit(E_PORT0,5);
  19. DrvGPIO_ClrBit(E_PORT0,5);
  20. DrvGPIO_SetBit(E_PORT0,5);
  21. DrvGPIO_ClrBit(E_PORT0,5);
  22. DrvGPIO_SetBit(E_PORT0,5);
  23. DrvGPIO_ClrBit(E_PORT0,5);
  24. DrvGPIO_SetBit(E_PORT0,5);
  25. DrvGPIO_ClrBit(E_PORT0,5);
  26. DrvGPIO_SetBit(E_PORT0,5);
  27. DrvGPIO_ClrBit(E_PORT0,5);
  28. DrvGPIO_ClrBit(E_PORT0,5);
  29. DrvGPIO_ClrBit(E_PORT0,5);
  30. DrvGPIO_ClrBit(E_PORT0,5);
  31. DrvGPIO_ClrBit(E_PORT0,5);
  32. }
  33. }

相关图片:


测试方法:用寄存器
  1. void main(void)
  2. {
  3. UNLOCKREG();
  4. DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);
  5. DrvSYS_SelectHCLKSource(0);
  6. //DrvSYS_Open(48000000); // 48MHz
  7. DrvSYS_Open(50000000);
  8. SystemCoreClockUpdate();
  9. delay_ms(100);
  10. LOCKREG();

  11. DrvGPIO_Open(E_PORT0, E_PIN5, E_IO_OUTPUT );
  12. while(1)
  13. {
  14. P05_DOUT = 1;
  15. P05_DOUT = 0;
  16. P05_DOUT = 1;
  17. P05_DOUT = 0;
  18. P05_DOUT = 1;
  19. P05_DOUT = 0;
  20. P05_DOUT = 1;
  21. P05_DOUT = 0;
  22. P05_DOUT = 1;
  23. P05_DOUT = 0;
  24. P05_DOUT = 1;
  25. P05_DOUT = 0;
  26. P05_DOUT = 1;
  27. P05_DOUT = 0;
  28. P05_DOUT = 1;
  29. P05_DOUT = 0;
  30. P05_DOUT = 0;
  31. P05_DOUT = 0;
  32. P05_DOUT = 0;
  33. P05_DOUT = 0;
  34. }
  35. }

相关图片

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

参与人数 1威望 +10 收起 理由
hotpower + 10

查看全部评分

 楼主| plc_avr 发表于 2011-11-5 08:25 | 显示全部楼层
自已做沙发...;P
Swallow_0322 发表于 2011-11-5 13:13 | 显示全部楼层
板凳...
hotpower 发表于 2011-11-5 16:21 | 显示全部楼层
不错。红杏可能要比寄存器慢一点点。
看看烈火有时间测试否???
红杏支持M0516
 楼主| plc_avr 发表于 2011-11-6 06:59 | 显示全部楼层
好的,上班时有空测一下。家伙都在公司,今天休息,没法搞,呵呵。
weshiluwei6 发表于 2011-11-6 09:47 | 显示全部楼层
火哥用的什么仪器啊 这么牛
 楼主| plc_avr 发表于 2011-11-6 10:05 | 显示全部楼层
非常便宜的8通道逻辑分析仪,呵呵。
Ryanhsiung 发表于 2011-11-7 07:54 | 显示全部楼层
这个很正常了,高要求的者最好不用库函数来操作。
   先前STM32的库操作一个I0口要100US,时间老长老长了!!!

我建议若时间不是要求在NS级的,可以自己改写或增加库函数来操作!!
   便于移植,便于阅读 等等
hotpower 发表于 2011-11-7 10:02 | 显示全部楼层
库函数为通用而设计,效率是不能保障的。M0516有快速IO,即将位映射为地址以加快访问速度。不过ARM指令集对位操作的效率是不高甚至是不支持的一般需要用位域,故效率不可能提高。
hotpower 发表于 2011-11-7 10:12 | 显示全部楼层
快速IO是一种用空间换时间的方法,它将位即位域的寻址变为了寄存器的寻址,这样就大大提高了对IO的访问时间。烈火可以试试。我在红杏中测试过,一般为三条指令。加入口地址不变,则后面的指令会更少。因为IO口的首地址已经从文字池中取出,那么只需偏移即可,故只需一条指令即可。
hotpower 发表于 2011-11-7 10:39 | 显示全部楼层
刚看见烈火在QQ的留言,说红杏编译不通过。一个估计是版本的问题,一个是需要新唐的头文件。
 楼主| plc_avr 发表于 2011-11-7 10:46 | 显示全部楼层
新唐的头文件我加了,是新版的库改动的较多,大叔有空时再看看。红杏我改不好,太菜了。呵呵。
 楼主| plc_avr 发表于 2011-11-7 10:57 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| plc_avr 发表于 2011-11-7 11:00 | 显示全部楼层
这两个文件都是新唐2011光盘里面的最新库文件。
 楼主| plc_avr 发表于 2011-11-7 11:03 | 显示全部楼层
花了一个星期将AVR的工程移值到M0516,终于快完工了,M0 12BIT ADC也非常给力,性能比AVR好N倍,价格也相近,我要远离AVR了,哈哈。
 楼主| plc_avr 发表于 2011-11-7 11:07 | 显示全部楼层
这个很正常了,高要求的者最好不用库函数来操作。
   先前STM32的库操作一个I0口要100US,时间老长老长了!!!

我建议若时间不是要求在NS级的,可以自己改写或增加库函数来操作!!
   便于移植,便于阅读 等等 ...
Ryanhsiung 发表于 2011-11-7 07:54

----------------------------
如果要100us才能控制一个IO,那黄花菜早都凉啦,我控制个IO 1us都不允许,太长时间了。如果有更简洁高效的控制方式,我肯定不会用库。呵呵。
hotpower 发表于 2011-11-7 11:10 | 显示全部楼层
建议烈火用快速IO,它是以寄存器地址分配位的
hotpower 发表于 2011-11-7 11:13 | 显示全部楼层
不过库函数也是有相当的参考价值的,明白了它再用寄存器或结构会更快捷的。
 楼主| plc_avr 发表于 2011-11-7 12:12 | 显示全部楼层
恩,我正在看相关的。我的源码还有很多要优化,以及原先的控制方式都要做改变。要发挥片子的最大性能。任重而道远啊,还得些时日磨合。
hotpower 发表于 2011-11-7 15:16 | 显示全部楼层
ARM系列对特殊寄存器的操作效率都不高,主要是ARM指令中就没有这个概念,只有哪个厂家使用时,才将指针指向特殊寄存器的地址。故操作用一条指令是不可能的。因为它至少要把寄存器的首地址先取出来后才能考虑其它操作。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:烈火DIY Mini四轴飞行器群:234879071  http://fire-dragon.taobao.com/

42

主题

1633

帖子

23

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:烈火DIY Mini四轴飞行器群:234879071  http://fire-dragon.taobao.com/

42

主题

1633

帖子

23

粉丝
快速回复 在线客服 返回列表 返回顶部