TI中文支持网
TI专业的中文技术问题搜集分享网站

c6701中断问题

使用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循环是一条一条执行的,随便可以被中断打断。

赞(0)
未经允许不得转载:TI中文支持网 » c6701中断问题
分享到: 更多 (0)