使用Q级6701,外部使用异步SRAM存放部分代码和变量,发现在
对外设有大量读写操作时,
定时中断有时没进去。请问这是什么原因,谢谢。
Shine:
中断标志位置1了么?看一下是中断没产生,还是产生了没进中断子程序?
Shine:
回复 Xiaohong Miao:
在主程序里加段判断IFR是否为1的调试代码,然后在判断是1的地方加个断点跑。
Xiaohong Miao:
回复 Shine:
这样可以抓到IFR为1的时候,可还是没法和中断服务程序同步判断。我的问题上次描述的不够清楚。我在SRAM中放一个长度为10000的大数組,用for循环语句对它赋值,此时用示波器看到相应的CE一直为低,中断服务程序中的计数器值未变。若在For循环中加一个NOP,现象消除。
另能否告知一个办公电话,这样沟通更清晰明了。
Xiaohong Miao:
回复 Xiaohong Miao:
我的电话010-88105451
Shine:
回复 Xiaohong Miao:
1. 把中断关掉,看SRAM大量读写操作是否正确?
2. 把SRAM大量读写操作关掉,看是否能进中断,确定中断的写法没有问题。
Xiaohong Miao:
回复 Shine:
这两个都没问题。只要加个nop,不让连续操作,就都正常。
Shine:
回复 Xiaohong Miao:
可能是排流水线的问题。http://processors.wiki.ti.com/index.php/Interrupts_Disabled_by_C6000_Compiler
Tony Tang:
回复 Xiaohong Miao:
Xiaohong Miao这两个都没问题。只要加个nop,不让连续操作,就都正常。
你编译加了优化选项了吧,这样就跟RTS库里的memcopy函数一样了。估计你加了优化-02,或者-o3,又没有加-mi=xxx选项,这时编译器就会尽量优化,在进入这个for循环之前会把全局中断关掉,退出时再打开,那么在这期间来了中断是不会响应的。
至于为什么优化后的代码要关闭全局中断,这里简单说一下,详细的自己了解一下流水线及寄存器的生命周期。
所谓的优化无非是把代码中的延时部分的nop周期用来执行有效代码,这样的结果从汇编代码来看就是乱序了,乱序后的代码是不能随便被中断的,因为中断返回后寄存器的值就有可能不对了,最后执行结果就不对了。所以为了保证优化后的乱序的代码结果正确,那么在进入相关代码前把中断关闭,退出时再打开。
你可以加-K选项,检查一下编译产生的汇编代码,看这个for循环前后是不是有这个全局中断的开关操作。
如果不加-o2, 或o3选项则不会有这个问题,随便可以中断,但是代码效率就慢了。那么这个矛盾怎么解决,则通过-mi选项,参考spru187文档。
如果不想中断被延时太长,或者说想这个时间可控,则在编译选项里加-mi=xxx,这个xxx代码最大可接受的中断延时指令周期数.
另外为什么加了nop后就没事了,因为C代码中插入汇编则优化选项不起作用了,你的for循环是一条一条执行的,随便可以被中断打断。