前一阵在做spi和dmx的验证的时候,spi模块在和主机通信的时候,主机软件必须加上很大的延时才能保证读到软件协议中的同步头,对于这个问题查了好几天,把spi和dma通信的每一步拆解分析,都是能够保证足够快的处理速度,并且模块间的协调也没有出问题,从收到主机从spi传来的数据到把应答压入到spi的fifo都是在极短时间内完成。
一次偶然的调试中把dmx模块关闭,结果spi传输就再也不出问题了,最终查出来居然是dmx的firmware中调用了printf,而恰恰是这些printf把spi中断推到了后面,导致通讯失去了实时性。查阅了一下arm的相关文档,在rvds中,如果调用了arm库提供的rvds的printf,那么在执行这个swi的时候,rvds会自动将arm的irq和fiq关闭,必须等到swi返回后才能恢复,而这些swi都是几十毫秒的执行时间。
在ARM架构中,swi却是比fiq和irq的优先级要低的异常,也就是说,在swi执行期间,如果软件不做特殊处理,irq和fiq异常依然可以得以响应,而rvds的做法却跟这个架构中写得明明白白的优先级相悖,我吐血鄙视rvds同学的这个特性,让我等无所适从,本来从架构方面分析我从来没怀疑过swi会延迟中断处理,浪费了好几天时间。 |