考虑我们正在为裸机MCU编写固件,即没有操作系统。我被告知不可能(非法?)将参数传递给中断处理函数?
我无法准确理解为什么会如此?这有什么问题?
PS。是否可以在某些RTOS-es,嵌入式Linux等中进行,或者它本质上是错误的?
答案 0 :(得分:5)
中断。做那......中断想象一下你家里的门铃,无论白天或晚上任何特定的随机时间打扰你。您是否可以随时掌握所有可能发生的特定中断的正确项目。你必须能够做饭,洗澡,折叠衣物,但就在门铃响起之前,你必须准备好双手正确的物品,这取决于敲响铃声的人,不知道他们在那里或是即将来临或即将响铃。不太可能。同样的处理,中断在任何特定时间到来,对于当前正在执行的指令之后的大多数处理器,调用中断处理程序,这意味着每个指令都必须尝试执行前台应用程序,同时保留中断的所有参数处理程序,并在一个指令时间内完成所有这些。
现在可能的是操作系统,或rtos或称之为你想要的,一些层。要让真正的中断处理程序知道什么都不知道并且必须弄明白,一旦它弄清楚中断是什么来收集信息然后调用传递参数的高级中断处理程序。当然可能和大多数/许多操作系统都是这样做的。
答案 1 :(得分:4)
没有参数可以显式传递给中断处理程序,因为它被设计为由硬件调用。每个体系结构在调用时都会强制执行特定的堆栈帧,通常包括CPU的保存状态。
如果你还打算从代码中的其他地方调用中断处理程序,你有一个设计缺陷,或者有一些公共代码可以在中断处理程序和算法代码之间共享。
答案 2 :(得分:3)
硬件调用中断处理程序。它被“传递”硬件传递的任何“参数”。
这就是全部。
答案 3 :(得分:3)
我要指出的唯一另一件事(目前尚未提及)是“软件中断”(有时称为“陷阱”)的概念,大多数处理器都支持这种概念。
这个想法是一个特殊的指令导致异常发生,并且通常使用软件中断,导致异常的操作码或在异常之前设置的寄存器可以包含值/参数。
例如,在ARM处理器中,根据您的体系结构查找“SWI”或“SVC”。我相信SWI指令,低8位不是操作码的一部分 - 你可以填写你想要的任何东西&传递一个0-255的值(这里的记忆有点模糊)。
与硬件启动的中断(与CPU上运行的代码完全异步)不同,软件中断是同步的 - 它在执行启动指令时发生(禁止中断屏蔽,嵌套等)。
答案 4 :(得分:0)
当你使用下面的调用设置一个中断处理程序时,看起来中断处理程序需要一些args并返回irqreturn_t。这是不是OP正在谈论的中断处理程序?
int request_irq(unsigned int irq,
irqreturn_t (*handler)(int, void *, struct pt_regs *),
unsigned long flags,
const char *dev_name,
void *dev_id);
答案 5 :(得分:0)
您可以在正常代码流期间使用共享变量来影响下次运行的中断处理程序的行为。但是因为你没有直接调用ISR,所以你不能传递参数。这不是合法性问题,而是技术性问题。
例如:
volatile enum
{
DO_NOTHING,
DO_A,
DO_B,
DO_C
} isr_action ;
__interrupt (SOME_IRQ) myISR()
{
switch isr_action
{
case DO_A :
{
// A
}
break ;
case DO_B :
{
// B
}
break ;
case DO_C :
{
// C
}
break ;
}
}
int main()
{
// Make ISR do A on next SOME_IRQ
isr_action = DO_A ;
for(;;)
{
// wait for interrupt
}
}