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.
您好!
在我的 MSP430FR5969中、我编写了一个代码、在该代码中、按下某个键时会触发中断。
但是、根据我的需求、我希望在每次中断(ISR)段执行后、执行一个特定的函数。
这样做的一种方法是在 ISR 中调用函数。 但是、由于函数足够大、这不是我要做的事情。
我发现另一种方法是修改返回地址。 有人能告诉我、如何实现这一点吗?
是否有其他方法来完成我的任务?
我无法使用基于设置标志的 ISR。 ISR 执行后需要立即调用该函数。 代码应忘记所有内容、并执行特殊功能。
示例:
ISR 段 { //执行 ISR //设置一些值以标记变量 。} void Special _ Emergency _ Func () { //这是每次执行 ISR 时优先执行的大型函数 } void main (void) { //init MSP430模块 while (1) { if (flag == x) { //执行这个大部分 //这些段非常大。 //在中断后,代码再次检查标志值之前,需要花费大量时间。 } 否则 if (flag == y) { //执行这个大部分 //这些段非常大。 //在中断后,代码再次检查标志值之前,需要花费大量时间。 } }
"一种方法是在 ISR 中调用函数。 但是、由于函数足够大、这不是我要做的事情。 "
在 ISR 中调用一个大型函数将增加 ISR 执行的时间。 应用无法承受一个中断中的大量时钟周期。
在实际的中断处理程序内、堆栈如下所示:
(笑声)
从主循环堆栈数据
PC (主循环中断的地方)
SR (主循环的)
由中断处理程序保存的寄存器
SP→中断处理程序的附加堆栈数据
要使中断处理程序返回到另一个函数、必须更改返回地址并修改栈、以便另一个函数返回到主循环:
(笑声)
从主循环堆栈数据
PC (主循环中断的地方)
SR (主循环的;这假定额外的函数被声明为一个中断处理程序)
PC (额外功能的开始)
SR (用于额外功能)
由中断处理程序保存的寄存器
SP→中断处理程序的附加堆栈数据
最后保存的 SR 下面的内容令人厌烦(因为您不知道编译器到底做什么);您可能应该在汇编器中编写中断处理程序、以便控制它在栈上推入的内容。 (如果您已经在使用汇编器、而不是推送额外函数的 PC/SR、则只需更改 SR 即可重新启用中断、并跳转到额外函数)。