Assembly 无法理解汇编中MSP430的中断
我不明白为什么在这段代码中会两次使用reti,为什么会调用jmp到P1.1,而不调用jmp到P1.2。这是一个错误吗 多谢各位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
;---------------------------------------------------------------------------
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:无中断´。它与中断源有关吗?