[ZLG-ARM] 郁闷:如何提高LPC2131运行速度.急

[复制链接]
2999|6
 楼主| cd666 发表于 2009-2-27 17:22 | 显示全部楼层 |阅读模式
情况如下:<br />外部有一频率为1M的时钟信号,占空比为50%,要求在每个时钟的下降沿读回一个8位数据.<br />系统使用11.0952M的晶体,PLL设为5倍.其它为周工的模板设置.<br />使用如下读数程序:<br />PINSEL0&nbsp;=&nbsp;0x20000005;&nbsp;//P0.14&nbsp;为INT1&nbsp;连接到UART0<br />EXTMODE&nbsp;=&nbsp;0x02;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;EINT1下降沿触发<br />EXTPOLAR&nbsp;=&nbsp;0x00;<br /><br />while(1)<br />{<br />IO0PIN&nbsp;=&nbsp;IO0PIN&nbsp;^&nbsp;IO1;&nbsp;&nbsp;&nbsp;&nbsp;//引脚取反&nbsp;测试用<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt100;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;while(EXTINT&nbsp;==&nbsp;0);&nbsp;&nbsp;&nbsp;&nbsp;//等待下降沿<br />&nbsp;&nbsp;&nbsp;&nbsp;EXTINT&nbsp;=&nbsp;0x0F;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//清外部中断标志&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;AD_buf&nbsp;=&nbsp;IO0PIN&nbsp;&gt&gt&nbsp;15;&nbsp;&nbsp;&nbsp;&nbsp;//读取AD数据<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />使用如此程序,原本读取100个信号,应用100US,结果实际测试需要125US多.<br />在使用axd仿真时,除了while(EXTINT==0)这句外,<br />每个读数循环执行了7条指令,共用16个内核周期.<br /><br />当将程序改为while(EXTINT==1)时,读数循环包括判定EXTINT标志在内共执行10条指令,用了18个内核周期.<br /><br />现在我就不明白了,执行不到20个内核周期为什么会用1.25us左右的时间.<br />按10.0592*5&nbsp;运行20个内核周期&nbsp;应是在1US内啊.&nbsp;为什么实际不是这样的呢.<br /><br />郁闷...在此请教各位了,是我那个地方理解错了,还是这个内核本来就这么慢.谢谢.<br /><br />或是谁能提供一个更快读数的方法.谢谢<br /><br /><br /><br />
ZLG_Dengz 发表于 2009-2-28 10:03 | 显示全部楼层

RE

&nbsp;&nbsp;&nbsp;&nbsp;你好,方便的话请把反汇编的代码贴出来,以便大家分析.&nbsp;另外I/O属于外设挂在VPB总线上的,他的访问速度是低于内核的访问速度的。另外由于有些跳转会清空流水线,导致内核的实际速度达不到一个周期一条指令。<br />&nbsp;&nbsp;&nbsp;&nbsp;另外可以将循环部分由C语言改成汇编看有没有能精简的指令,嵌进去试试。
 楼主| cd666 发表于 2009-3-2 15:54 | 显示全部楼层

反汇编代码如下

0xe59fe050]&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r14,0x00000414&nbsp;;&nbsp;=&nbsp;#0xe01fc000<br />[0xe3a0200f]&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,#0xf<br />[0xe1a0c004]&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r12,r4<br />[0xe59c0000]&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,[r12,#0]&nbsp;&nbsp;&nbsp;&nbsp;//端口取反测试用<br />[0xe2200d80]&nbsp;&nbsp;&nbsp;eor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r0,#0x2000<br />[0xe58c0000]&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,[r12,#0]<br />[0xe3a00000]&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,#0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//循环初值<br />[0xe5de1140]&nbsp;&nbsp;&nbsp;ldrb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,[r14,#0x140]<br />[0xe3510001]&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,#1<br />[0x0afffffc]&nbsp;&nbsp;&nbsp;beq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x3d8&nbsp;&nbsp;;&nbsp;(main&nbsp;+&nbsp;0x9c)<br />[0xe5ce2140]&nbsp;&nbsp;&nbsp;strb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,[r14,#0x140]&nbsp;&nbsp;//清中断标志<br />[0xe59c1000]&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,[r12,#0]<br />[0xe1a017a1]&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,r1,lsr&nbsp;#15<br />[0xe7c31000]&nbsp;&nbsp;&nbsp;strb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,[r3,r0]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//存数据<br />[0xe2800001]&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r0,#1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//循环增量<br />[0xe3500ffa]&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,#0x3e8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//循环上限比较<br />[0x3afffff5]&nbsp;&nbsp;&nbsp;bcc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x3d8&nbsp;&nbsp;;&nbsp;(main&nbsp;+&nbsp;0x9c)<br /><br />这是ads1.2的反汇编代码.因为是初学arm,也不知道反汇编的注释有没加错.还请各位提点下.<br />
 楼主| cd666 发表于 2009-3-4 08:35 | 显示全部楼层

难道高手都看不上这种简单问题

看来这个问题问得有些笨.......
王紫豪 发表于 2009-3-5 01:05 | 显示全部楼层

这个arm干了这件事还能干别的吗?建议加fifo或者cpld

  
ddpxy 发表于 2009-4-2 13:26 | 显示全部楼层

倍频之后要还是 不行那就没有招了

  
 楼主| cd666 发表于 2009-4-4 21:13 | 显示全部楼层

感谢各位

感谢大家,看来还是要多关心下一下自己发出的贴子.<br />还好自己又钻研了几天之后,才发现周工的启动代码VBP频率是设为最低的.<br />现在问题已经搞定.<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

47

主题

153

帖子

0

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