打印
[菜农助学交流]

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

[复制链接]
12763|51
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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芯片上测试的。
测试方法:用官方驱动库
void main(void)
{
UNLOCKREG();
DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);
DrvSYS_SelectHCLKSource(0);
//DrvSYS_Open(48000000); // 48MHz
DrvSYS_Open(50000000);
SystemCoreClockUpdate();
delay_ms(100);
LOCKREG();

DrvGPIO_Open(E_PORT0, E_PIN5, E_IO_OUTPUT );
while(1)
{
DrvGPIO_SetBit(E_PORT0,5);
DrvGPIO_ClrBit(E_PORT0,5);
DrvGPIO_SetBit(E_PORT0,5);
DrvGPIO_ClrBit(E_PORT0,5);
DrvGPIO_SetBit(E_PORT0,5);
DrvGPIO_ClrBit(E_PORT0,5);
DrvGPIO_SetBit(E_PORT0,5);
DrvGPIO_ClrBit(E_PORT0,5);
DrvGPIO_SetBit(E_PORT0,5);
DrvGPIO_ClrBit(E_PORT0,5);
DrvGPIO_SetBit(E_PORT0,5);
DrvGPIO_ClrBit(E_PORT0,5);
DrvGPIO_SetBit(E_PORT0,5);
DrvGPIO_ClrBit(E_PORT0,5);
DrvGPIO_ClrBit(E_PORT0,5);
DrvGPIO_ClrBit(E_PORT0,5);
DrvGPIO_ClrBit(E_PORT0,5);
DrvGPIO_ClrBit(E_PORT0,5);
}
}

相关图片:


测试方法:用寄存器
void main(void)
{
UNLOCKREG();
DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);
DrvSYS_SelectHCLKSource(0);
//DrvSYS_Open(48000000); // 48MHz
DrvSYS_Open(50000000);
SystemCoreClockUpdate();
delay_ms(100);
LOCKREG();

DrvGPIO_Open(E_PORT0, E_PIN5, E_IO_OUTPUT );
while(1)
{
P05_DOUT = 1;
P05_DOUT = 0;
P05_DOUT = 1;
P05_DOUT = 0;
P05_DOUT = 1;
P05_DOUT = 0;
P05_DOUT = 1;
P05_DOUT = 0;
P05_DOUT = 1;
P05_DOUT = 0;
P05_DOUT = 1;
P05_DOUT = 0;
P05_DOUT = 1;
P05_DOUT = 0;
P05_DOUT = 1;
P05_DOUT = 0;
P05_DOUT = 0;
P05_DOUT = 0;
P05_DOUT = 0;
P05_DOUT = 0;
}
}

相关图片
评分
参与人数 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

使用特权

评论回复
5
plc_avr|  楼主 | 2011-11-6 06:59 | 只看该作者
好的,上班时有空测一下。家伙都在公司,今天休息,没法搞,呵呵。

使用特权

评论回复
6
weshiluwei6| | 2011-11-6 09:47 | 只看该作者
火哥用的什么仪器啊 这么牛

使用特权

评论回复
7
plc_avr|  楼主 | 2011-11-6 10:05 | 只看该作者
非常便宜的8通道逻辑分析仪,呵呵。

使用特权

评论回复
8
Ryanhsiung| | 2011-11-7 07:54 | 只看该作者
这个很正常了,高要求的者最好不用库函数来操作。
   先前STM32的库操作一个I0口要100US,时间老长老长了!!!

我建议若时间不是要求在NS级的,可以自己改写或增加库函数来操作!!
   便于移植,便于阅读 等等

使用特权

评论回复
9
hotpower| | 2011-11-7 10:02 | 只看该作者
库函数为通用而设计,效率是不能保障的。M0516有快速IO,即将位映射为地址以加快访问速度。不过ARM指令集对位操作的效率是不高甚至是不支持的一般需要用位域,故效率不可能提高。

使用特权

评论回复
10
hotpower| | 2011-11-7 10:12 | 只看该作者
快速IO是一种用空间换时间的方法,它将位即位域的寻址变为了寄存器的寻址,这样就大大提高了对IO的访问时间。烈火可以试试。我在红杏中测试过,一般为三条指令。加入口地址不变,则后面的指令会更少。因为IO口的首地址已经从文字池中取出,那么只需偏移即可,故只需一条指令即可。

使用特权

评论回复
11
hotpower| | 2011-11-7 10:39 | 只看该作者
刚看见烈火在QQ的留言,说红杏编译不通过。一个估计是版本的问题,一个是需要新唐的头文件。

使用特权

评论回复
12
plc_avr|  楼主 | 2011-11-7 10:46 | 只看该作者
新唐的头文件我加了,是新版的库改动的较多,大叔有空时再看看。红杏我改不好,太菜了。呵呵。

使用特权

评论回复
13
plc_avr|  楼主 | 2011-11-7 10:57 | 只看该作者
M051-NUC1xx头文件.rar (37.66 KB)

使用特权

评论回复
14
plc_avr|  楼主 | 2011-11-7 11:00 | 只看该作者
这两个文件都是新唐2011光盘里面的最新库文件。

使用特权

评论回复
15
plc_avr|  楼主 | 2011-11-7 11:03 | 只看该作者
花了一个星期将AVR的工程移值到M0516,终于快完工了,M0 12BIT ADC也非常给力,性能比AVR好N倍,价格也相近,我要远离AVR了,哈哈。

使用特权

评论回复
16
plc_avr|  楼主 | 2011-11-7 11:07 | 只看该作者
这个很正常了,高要求的者最好不用库函数来操作。
   先前STM32的库操作一个I0口要100US,时间老长老长了!!!

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

----------------------------
如果要100us才能控制一个IO,那黄花菜早都凉啦,我控制个IO 1us都不允许,太长时间了。如果有更简洁高效的控制方式,我肯定不会用库。呵呵。

使用特权

评论回复
17
hotpower| | 2011-11-7 11:10 | 只看该作者
建议烈火用快速IO,它是以寄存器地址分配位的

使用特权

评论回复
18
hotpower| | 2011-11-7 11:13 | 只看该作者
不过库函数也是有相当的参考价值的,明白了它再用寄存器或结构会更快捷的。

使用特权

评论回复
19
plc_avr|  楼主 | 2011-11-7 12:12 | 只看该作者
恩,我正在看相关的。我的源码还有很多要优化,以及原先的控制方式都要做改变。要发挥片子的最大性能。任重而道远啊,还得些时日磨合。

使用特权

评论回复
20
hotpower| | 2011-11-7 15:16 | 只看该作者
ARM系列对特殊寄存器的操作效率都不高,主要是ARM指令中就没有这个概念,只有哪个厂家使用时,才将指针指向特殊寄存器的地址。故操作用一条指令是不可能的。因为它至少要把寄存器的首地址先取出来后才能考虑其它操作。

使用特权

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

本版积分规则

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

42

主题

1633

帖子

23

粉丝