如图所示,红圈中的文字是什么意思,DINT指令后跟随NOP指令的原因是啥。在胡大可的中午书中的例子中并没有NOP。是否DINT执行后的第一条指令仍有被中断的风险。
再有EINT指令,上图红圈中所述是否表达的是:EINT后的这条指令会不受中断影响,即使目前有已经挂起的中断请求。
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.
如图所示,红圈中的文字是什么意思,DINT指令后跟随NOP指令的原因是啥。在胡大可的中午书中的例子中并没有NOP。是否DINT执行后的第一条指令仍有被中断的风险。
再有EINT指令,上图红圈中所述是否表达的是:EINT后的这条指令会不受中断影响,即使目前有已经挂起的中断请求。
任何指令都不可能被中斷. 中斷只可能在一個指令和下一個指令之間發生.
DINT 和 EING 在執行下一條指令後才生效.
因此, 在下面的指令序列中; DINT 和 指令1 之間可能被中斷. 指令1到指令a之間不可能被中斷. 指令a後可能被中斷.
...
DINT
指令1
指令2
指令3
指令4
…
EINT
指令a
指令b
指令c
…
感谢你的回复!同意你的看法,我可能没表达清楚,我指被中断就是在指令与指令之间。
实际上我最困惑的位置来自数据手册中DINT的那个例子和它下面的注解。如下例:
DINT
NOP
指令1
指令2
在后面的注释中也提到这个NOP,按常规理解中断只会发生在NOP指令之前,那NOP指令还有存在的必要吗?在胡大可早期的译注书中(翻译自用户指南)也有同样的例子,几乎完全一样。不同的就是没有加NOP和相关NOP的文字注释。
在举例:
下面两种代码,都在执行DINT指令时发生中断请求,中断处理程序没有列出,中断处理是对R15进行-1操作。
clr r15
DINT
inc r15
jmp $
;-------------------------------------
clr r15
DINT
nop
inc r15
jmp $
最后结果会有不同?还是我的例子不太恰当没有找到比较好的切入点?
如果假设NOP指令加在这里确实有特殊的原因,那这个原因是什么?本质又是什么原因造成的呢?
由这个DINT后加NOP可以引申到与DINT相对应的EINT,EINT是不是也会存在同样或类似的原因呢。
XiaoLiang Gao 说:实际上我最困惑的位置来自数据手册中DINT的那个例子和它下面的注解。如下例:
DINT
NOP
指令1
指令2
在后面的注释中也提到这个NOP,按常规理解中断只会发生在NOP指令之前, . . .
可是使用手冊似乎是說中断仍然可能会发生在NOP指令之後. 也就是說, DING在執行下一條指令 (NOP) 後才生效. 舊扳的使用手冊沒有提到這一點. 我不知誰是誰非.
NOP在这里使问题看起来变得复杂、有意思了。
从JTAG仿真MSP430169来看,中断位置发生在NOP之前。但这只是初步试验的结果,无法定性。
假设我首贴贴图中的数据手册正确,并且可以理解成 ‘中断有机会发生在NOP指令之后’,那么下面这个例子会出现什么情况呢?
DINT
EINT
指令1
指令2
注:假设中断请求发生在DINT指令执行时。
那么中断实际发生在哪里呢?EINT指令之前和指令1之后两种情况都有可能?
建议大家参考下 http://www.ti.com.cn/cn/lit/ug/slau387c/slau387c.pdf 第7页的说明。
Susan Yang 说:建议大家参考下 http://www.ti.com.cn/cn/lit/ug/slau387c/slau387c.pdf 第7页的说明。
感谢提供资料!这份资料以前确实没看过,比用户指南详尽多了,非常不错。
第7页部分贴图如下
虽然上楼我举的例子中,是EINT和DINT联用,实际上我是不可能这样用的,但是得到官方的说明仍然是一件非常令人高兴的事。
只是关于本帖最原始的问题(nop或其它指令插入DINT后的必要性的本质问题),我目前还没有找到任何官方的资料,希望能得到你的帮助。
因为TI早期的那份资料中确实没有提及这个问题,这个问题源自430的体系结构,应该从设计之初就不会有重大改变,但是什么原因早期没有提及这个问题呢?
而现在用户指南中提及这个NOP插入的理论支撑又是什么呢?
http://v.youku.com/v_show/id_XODcyNDEwMjg4.html
上面是我用F169做测试的视频。这个视频以在几天前发给TI。
昨天TI最新一次回复给了一个论坛链接http://e2e.ti.com/support/microcontrollers/msp430/f/166/p/53319/838507
链接中有网友关于EINT 和DINT 问题的讨论。Jens-Michael Gross 的观点能很好解释这个问题,但没有得到TI的官方确认。
Jens-Michael Gross的观点大致上说430的冯诺依曼+指令预取构架造成这个问题。
Jens-Michael Gross的部分发言如下:
"Now in this case, the instruction following the DINT is already fetched at the moment when GIE is cleared. Now at this point, an interrupt may already have been granted (after fetching the DINT instruction but before executing it), and sicne the following isntruciton was already fetched, it will be exeuted before the already granted interrupt is performed."