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.

请教关于MSP430汇编中的指令DINT和EINT。(文中图片来自MSP430F169的英文用户指南)

Other Parts Discussed in Thread: MSP430F2011, MSP430G2553, MSP430F5529

如图所示,红圈中的文字是什么意思,DINT指令后跟随NOP指令的原因是啥。在胡大可的中午书中的例子中并没有NOP。是否DINT执行后的第一条指令仍有被中断的风险。

再有EINT指令,上图红圈中所述是否表达的是:EINT后的这条指令会不受中断影响,即使目前有已经挂起的中断请求。

  • 没看过胡大可的中午书。

    这种情况以官方的资料为准就好。非官方的资料偶尔会有写错误或者问题也很常见,你懂得

  • 呵呵,拼音害死人啊,是‘中文书’。上面的英文就是官方资料,事实上官方资料错误也不少,描述指令的这几页就有。

    我的这个问题是没太理解官方资料所述,胡大可的中文资料翻译自早期的官方英文,所以可以简单借鉴。

    总结我的问题是: 1、DINT后的第一条指令知否仍有被中断的风险?这个NOP插在这里的真实作用是什么?

                                     2、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之后两种情况都有可能?
     

  • 再看看这个TI原作 《 MSP430 Family Architecture Guide and Module Library》中附录的说明。

  • Susan Yang 说:

    建议大家参考下  http://www.ti.com.cn/cn/lit/ug/slau387c/slau387c.pdf 第7页的说明。

    感谢提供资料!这份资料以前确实没看过,比用户指南详尽多了,非常不错。

    第7页部分贴图如下

    虽然上楼我举的例子中,是EINT和DINT联用,实际上我是不可能这样用的,但是得到官方的说明仍然是一件非常令人高兴的事。

    只是关于本帖最原始的问题(nop或其它指令插入DINT后的必要性的本质问题),我目前还没有找到任何官方的资料,希望能得到你的帮助。

    因为TI早期的那份资料中确实没有提及这个问题,这个问题源自430的体系结构,应该从设计之初就不会有重大改变,但是什么原因早期没有提及这个问题呢?

    而现在用户指南中提及这个NOP插入的理论支撑又是什么呢?

  • 正在积极与TI联系,感兴趣的朋友请耐心等待。感谢Susan Yang的大力协助!
  • 我做了一些測試來觀察下面的片段代碼中, 何處不能接受中斷. 結果和用戶指南中的描述, 大有出入.

    根據用戶指南, 紅色方框裡面的代碼不能受中斷. 我的測試結果則是, 如果使用 MSP430F2011 或 MSP430G2553, 綠色方框裡面的代碼不能受中斷.

    如果使用 MSP430FM5739 或 MSP430F5529, 藍色方框裡面的代碼不能受中斷.

  •   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 问题的讨论。 的观点能很好解释这个问题,但没有得到TI的官方确认。

    的观点大致上说430的冯诺依曼+指令预取构架造成这个问题。

    的部分发言如下:

    "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."

  • DINT

    NOP

    指令1

    指令2

    也就是说上面的例子按照  的说法,中断有机会发生在NOP与指令1之间。