Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 无法理解汇编中MSP430的中断_Assembly_Interrupt_Msp430_Isr - Fatal编程技术网

Assembly 无法理解汇编中MSP430的中断

Assembly 无法理解汇编中MSP430的中断,assembly,interrupt,msp430,isr,Assembly,Interrupt,Msp430,Isr,我不明白为什么在这段代码中会两次使用reti,为什么会调用jmp到P1.1,而不调用jmp到P1.2。这是一个错误吗 多谢各位 ;--------------------------------------------------------------------------- P1ISR add.w &P1IV, PC reti reti jmp P1_1 ;jmp P1_2 P1_2 x

我不明白为什么在这段代码中会两次使用reti,为什么会调用jmp到P1.1,而不调用jmp到P1.2。这是一个错误吗

多谢各位

;---------------------------------------------------------------------------
P1ISR   add.w &P1IV, PC 
        reti 
        reti 
        jmp     P1_1 
       ;jmp    P1_2 

P1_2   xor.b #L2, &P9OUT 
       bit.b #S1, &P1IN 
       jnz P1_2Fin 
       xor.b #L1, &P1OUT 
P1_2Fin reti

P1_1   xor.b #L1, &P1OUT 
       xor.b #S1, &P1IES 
       reti


.intvecPORT1_VECTOR, P1ISR

MSP芯片的用户指南上说:

端口中断

[…]所有P1中断标志都按优先级排列,其中P1IFG.0为最高值,并组合为一个中断向量源。最高优先级启用的中断在P1IV寄存器中生成一个数字。可以计算该数字或将其添加到程序计数器中,以自动进入相应的软件例程。禁用的P1中断不会影响P1IV值。
[…]
对P1IV寄存器低位字节的任何访问(读或写),无论是字访问还是字节访问,都会自动重置最高挂起中断标志。如果设置了另一个中断标志,则在维护初始中断后,会立即生成另一个中断。[……]

端口中断软件示例

下面的软件示例显示了建议使用的P1IV和处理开销。将P1IV值添加到PC,以自动跳转到相应的例程。P2IV是类似的

右边距的数字显示每条指令所需的CPU周期。不同中断源的软件开销包括中断延迟和中断周期返回,但不包括任务处理本身

;Interrupt handler for P1                           Cycles
P1_HND   ...             ; Interrupt latency            6
         ADD  &P1IV,PC   ; Add offset to Jump table     3
         RETI            ; Vector 0: No interrupt       5
         JMP  P1_0_HND   ; Vector 2: Port 1 bit 0       2
         JMP  P1_1_HND   ; Vector 4: Port 1 bit 1       2
         JMP  P1_2_HND   ; Vector 6: Port 1 bit 2       2
         JMP  P1_3_HND   ; Vector 8: Port 1 bit 3       2
         JMP  P1_4_HND   ; Vector 10: Port 1 bit 4      2
         JMP  P1_5_HND   ; Vector 12: Port 1 bit 5      2
         JMP  P1_6_HND   ; Vector 14: Port 1 bit 6      2
         JMP  P1_7_HND   ; Vector 16: Port 1 bit 7      2

P1_7_HND                 ; Vector 16: Port 1 bit 7
         ...             ; Task starts here
         RETI            ; Back to main program         5

P1_6_HND                 ; Vector 14: Port 1 bit 6
         ...             ; Task starts here
         RETI            ; Back to main program         5
...

MSP芯片的用户指南上说:

端口中断

[…]所有P1中断标志都按优先级排列,其中P1IFG.0为最高值,并组合为一个中断向量源。最高优先级启用的中断在P1IV寄存器中生成一个数字。可以计算该数字或将其添加到程序计数器中,以自动进入相应的软件例程。禁用的P1中断不会影响P1IV值。
[…]
对P1IV寄存器低位字节的任何访问(读或写),无论是字访问还是字节访问,都会自动重置最高挂起中断标志。如果设置了另一个中断标志,则在维护初始中断后,会立即生成另一个中断。[……]

端口中断软件示例

下面的软件示例显示了建议使用的P1IV和处理开销。将P1IV值添加到PC,以自动跳转到相应的例程。P2IV是类似的

右边距的数字显示每条指令所需的CPU周期。不同中断源的软件开销包括中断延迟和中断周期返回,但不包括任务处理本身

;Interrupt handler for P1                           Cycles
P1_HND   ...             ; Interrupt latency            6
         ADD  &P1IV,PC   ; Add offset to Jump table     3
         RETI            ; Vector 0: No interrupt       5
         JMP  P1_0_HND   ; Vector 2: Port 1 bit 0       2
         JMP  P1_1_HND   ; Vector 4: Port 1 bit 1       2
         JMP  P1_2_HND   ; Vector 6: Port 1 bit 2       2
         JMP  P1_3_HND   ; Vector 8: Port 1 bit 3       2
         JMP  P1_4_HND   ; Vector 10: Port 1 bit 4      2
         JMP  P1_5_HND   ; Vector 12: Port 1 bit 5      2
         JMP  P1_6_HND   ; Vector 14: Port 1 bit 6      2
         JMP  P1_7_HND   ; Vector 16: Port 1 bit 7      2

P1_7_HND                 ; Vector 16: Port 1 bit 7
         ...             ; Task starts here
         RETI            ; Back to main program         5

P1_6_HND                 ; Vector 14: Port 1 bit 6
         ...             ; Task starts here
         RETI            ; Back to main program         5
...

实际上,它看起来像是第一条指令,
add.w&P1IV,PC
正在进行计算跳转(或C
开关
),然后将您带到以下4条指令之一,其中两条指令只返回。不需要
jmp P1_2
,因为
P1_2
本身就在那里。我假设P1IV是某种模式控制。@Jester你指的是哪4条指令?另外,jmp P1_2不会忽略
P1_2
?添加.w后的4条指令分别处理一个单独的情况。不需要
JMP P1_2
,因为它会跳转到cpu要去的地方。如果您有其他情况,如中更完整的示例中所示,那么您也需要跳转。但是,因为这是代码中的最后一种情况,所以不需要跳转。@Jester我认为通过执行
jmp P1_1
cpu跳过了
P1_2
。那么jmp是如何工作的呢?多谢各位much@Jester非常感谢您的解释,我已经理解了
P1IV
。现在我有另一个问题,我已经看到这些例子使用了
P1IFG
,你什么时候使用每一个?实际上它看起来像第一条指令,
add.w&P1IV,PC
正在做一个计算跳转(或C
开关
),然后将你带到下面4条指令中的一条,其中两条只是返回。不需要
jmp P1_2
,因为
P1_2
本身就在那里。我假设P1IV是某种模式控制。@Jester你指的是哪4条指令?另外,jmp P1_2不会忽略
P1_2
?添加.w后的4条指令分别处理一个单独的情况。不需要
JMP P1_2
,因为它会跳转到cpu要去的地方。如果您有其他情况,如中更完整的示例中所示,那么您也需要跳转。但是,因为这是代码中的最后一种情况,所以不需要跳转。@Jester我认为通过执行
jmp P1_1
cpu跳过了
P1_2
。那么jmp是如何工作的呢?多谢各位much@Jester非常感谢您的解释,我已经理解了
P1IV
。现在我有另一个问题,我已经看到了这些使用
P1IFG
的例子,你什么时候使用每一个?谢谢,我已经看到了,但我仍然不理解。为什么在
add
后面使用
reti
?请看reti后面的注释。我不理解注释。你能解释一下它的意思吗`视网膜;向量0:无中断´。它和中断源有关吗?谢谢,我已经看过了,但我还是不明白。为什么在
add
后面使用
reti
?请看reti后面的注释。我不理解注释。你能解释一下它的意思吗`视网膜;向量0:无中断´。它与中断源有关吗?