本帖最后由 w00d 于 2011-2-1 00:14 编辑
最近有个项目,需要响应一个很频繁的AD中断,大概14us发生一次中断。用的是NXP的LPC1766,100MHz。因为每次都需要对数据进行分析和处理,所以不能使用DMA,这样对中断程序的性能要求就非常苛刻了。虽然程序还没有完全写好,但是也已经搭建好了框架,大概能够看出一些情况了。
里面主要是一个switch语句,我在中断服务程序的进入点和退出点分别改变芯片引脚状态,发现整个程序大概为800ns。运行时间最长的是读取外设寄存器的时间,大概达到了310ns,这对于单条指令时间为10ns的LPC1766来说当然太长了。通过观察反汇编程序,其流程如下:
1.通过相对于PC的寻址方式,将FLASH中的寄存器地址载入寄存器。
2.读取外设内容进入寄存器。
我分析了一下,初步认为是因为读取FLASH的时候打破了流水线和FLASH加速,从而造成了极大的延迟。想了n多办法都没有效果,后来看了一下LPC1766的框图,发现nxp好像将i-codebus,d-codebus和system bus都进入了多层总线阵列中,打破了arm公司的CM3定义,这样程序在ram中跑应该可以全速跑,试了一下,整个程序大概跑了600ns,提高还是很可观的。
大家谈谈吧,还有什么办法能够提高性能。不要说什么使用汇编,我看了反汇编出来的程序,估计自己写也提高不会太大。 |