This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

c6701中断问题

使用Q级6701,外部使用异步SRAM存放部分代码和变量,发现在

对外设有大量读写操作时,

定时中断有时没进去。请问这是什么原因,谢谢。

  • 中断标志位置1了么?看一下是中断没产生,还是产生了没进中断子程序?

  • 这个好像不太好判断,IFR为1的状态本身就不好抓,我直接在中断服务程序中读,读到的一直是0,我在哪判合适?

  • 在主程序里加段判断IFR是否为1的调试代码,然后在判断是1的地方加个断点跑。

  • 这样可以抓到IFR为1的时候,可还是没法和中断服务程序同步判断。我的问题上次描述的不够清楚。我在SRAM中放一个长度为10000的大数組,用for循环语句对它赋值,此时用示波器看到相应的CE一直为低,中断服务程序中的计数器值未变。若在For循环中加一个NOP,现象消除。

    另能否告知一个办公电话,这样沟通更清晰明了。

  • 我的电话010-88105451

  • 1. 把中断关掉,看SRAM大量读写操作是否正确?

    2. 把SRAM大量读写操作关掉,看是否能进中断,确定中断的写法没有问题。

  • 这两个都没问题。只要加个nop,不让连续操作,就都正常。

  • 可能是排流水线的问题。
    http://processors.wiki.ti.com/index.php/Interrupts_Disabled_by_C6000_Compiler

     

  • Xiaohong Miao 说:
    这两个都没问题。只要加个nop,不让连续操作,就都正常。

    你编译加了优化选项了吧,这样就跟RTS库里的memcopy函数一样了。估计你加了优化-02,或者-o3,又没有加-mi=xxx选项,这时编译器就会尽量优化,在进入这个for循环之前会把全局中断关掉,退出时再打开,那么在这期间来了中断是不会响应的。

    至于为什么优化后的代码要关闭全局中断,这里简单说一下,详细的自己了解一下流水线及寄存器的生命周期。

    所谓的优化无非是把代码中的延时部分的nop周期用来执行有效代码,这样的结果从汇编代码来看就是乱序了,乱序后的代码是不能随便被中断的,因为中断返回后寄存器的值就有可能不对了,最后执行结果就不对了。所以为了保证优化后的乱序的代码结果正确,那么在进入相关代码前把中断关闭,退出时再打开。

    你可以加-K选项,检查一下编译产生的汇编代码,看这个for循环前后是不是有这个全局中断的开关操作。

    如果不加-o2, 或o3选项则不会有这个问题,随便可以中断,但是代码效率就慢了。那么这个矛盾怎么解决,则通过-mi选项,参考spru187文档。

    如果不想中断被延时太长,或者说想这个时间可控,则在编译选项里加-mi=xxx,这个xxx代码最大可接受的中断延时指令周期数.

    另外为什么加了nop后就没事了,因为C代码中插入汇编则优化选项不起作用了,你的for循环是一条一条执行的,随便可以被中断打断。