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.

关于流水和中断的问题

小弟一直没有搞清楚流水和中断的问题,想请专家们给解释一下:

1)优化后的代码,即流水很充分的代码,执行过程中,可否允许中断发生?

2)若发生中断,对流水本身有何影响?

3)流水过程中,若发生中断,中断的响应会否延后?若延后,延后的周期数怎么确定?

4)若发生中断延后的情况,如何避免这个延后?

希望专家们针对以上4个问题不吝赐教,或者给出相应的文档,小弟好参详

  • Shaquille Wu 说:
    1)优化后的代码,即流水很充分的代码,执行过程中,可否允许中断发生?

    通常情况下不允许。

    Shaquille Wu 说:
    2)若发生中断,对流水本身有何影响?

    可能导致结果不对。

    Shaquille Wu 说:
    3)流水过程中,若发生中断,中断的响应会否延后?若延后,延后的周期数怎么确定?

    如果中断没有被disable,就会被响应。

    Shaquille Wu 说:
    4)若发生中断延后的情况,如何避免这个延后?

    这是代码效率与中断实时响应之间权衡的问题。首先了解一个道理,没有绝对的实时,只要满足你系统的需求就算是满足你的实时要求。看spru187t文档里-mi选项。

  • 非常感谢专家的回复,

    不过有个疑问,按照您的意思,在流水代码的首位都要添加disable int和enable int,这样的语句,是这样吗?

    平时,我都没有添加,貌似也没出什么问题,这是为什么呢?

    比如,算法正在执行,我并没有disable int,此时GPIO的上的某个管脚正在监听某个中断的发生(并且这个监听是必须要进行的)。

    或者说,算法正在执行,网络部分必须监听外部发来的命令。

    像我这样的处理,肯定错了吗?

    按照您的意思,好像必须通过-mi设定一个延迟,在某个流水结束的时候,再让int响应,是这么理解吗?

    通常,我在-mi的地方设定的是200,也就是延迟200个cycle。

    如果是这样理解,假设某个循环次数很大,那么这个流水肯能会经历非常大的周期数,200个cycle显然是不够的,那这种情况下,-mi的设定岂不是没用了?

  • 你写的汇编吗?

    如果不是,这些都是编译器完成了中断的disable和enable。

    Shaquille Wu 说:
    通常,我在-mi的地方设定的是200,也就是延迟200个cycle。

    是最多延迟200cycle.

    Shaquille Wu 说:
    如果是这样理解,假设某个循环次数很大,那么这个流水肯能会经历非常大的周期数,200个cycle显然是不够的,那这种情况下,-mi的设定岂不是没用了?

    不是-mi没用,而是流水安排会按200cycle分段,其实看一下加了-mi后编译产生的汇编代码,可以看到对全局中断的关闭和打开的。