gpt4 book ai didi

c - MSP430 中断开销

转载 作者:行者123 更新时间:2023-11-30 20:23:48 25 4
gpt4 key购买 nike

我正在为 MSP430 编写 ISR。它读取 volatile PxIFG 寄存器并将其复制到第一条指令上的堆栈变量中。 ISR 跳转是否有任何开销或者我可以期待

__interrupt void SW_PRESSED_ISR(void)
{
unsigned short currnet_ifg = P4IFG;
...
}

编译成类似的东西

... Register saving instructions
JSR ... // jump into ISR
LD P4IFG ... // load volatile register P4IFG value
...

我知道如果 ISR 跳转后的第一条指令是寄存器加载,我的 ISR 将按预期工作。我的理解是MSP430保证跳转后有一条指令可以再次中断。如果加载不是跳转后的第一条指令,我会遇到这样的问题:在读取 P4IFG 寄存器之前,我可能会再次中断,并且它的值可能会更改为不同的值,这将是一个问题。

我期望编译器在跳转之后立即放置我的加载指令,从而确保我总是能在另一个中断可以更改它之前获得该寄存器的副本,这是否合理?

谢谢

最佳答案

无论您使用的是哪种 MSP430 芯片,其用户指南中都会解答您的所有问题。

您的代码不会调用中断;当外部事件触发它们时,它们由 CPU 自动执行。将PC和SR寄存器保存到堆栈、清除GIE位以及读取并跳转到中断 vector 需要六个周期。但是,如果禁用中断,则中断可以延迟任意时间。

在中断处理程序内,中断被禁用(除非您明确地重新启用它们)。

P4IFG 寄存器中的位不是由您的代码设置的,因此是否启用中断并不重要。每当配置的信号边沿发生在其中一个引脚时(这可能发生在任何时间),新的位就会被设置,但先前设置的位不会被清除。

在中断处理程序中,您应该读取中断标志并清除已读取的那些位。 (如果在中断处理程序执行时发生新事件,则在返回后您将收到新中断。)

__interrupt void SW_PRESSED_ISR(void)
{
uint16_t ifg = P4IFG;
P4IFG &= ~ifg;

if (ifg & ...)
...
}

使用中断 vector 寄存器可能是一个更好的主意,它自动返回端口的中断之一,并重置相应的标志位:

__interrupt void SW_PRESSED_ISR(void)
{
switch (P4IV) {
case P4IV_P4IFG0:
// event at bit 0
break;
case P4IV_P4IFG1:
// event at bit 1
break;
...
}
}

关于c - MSP430 中断开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35401034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com