为什么我不能使用值取决于中断标志的全局 bool 变量?
Why can't I use a global bool variable whose value depends on interrupt flags?
我正在尝试等待中断以继续执行代码,如下所示:
bool flag = false;
void interrupt_handler (uintptr_t context)
{
flag = true;
}
void main()
{
CallbackRegister(event, interrupt_handler,0);
while(!flag);
}
但即使发生中断,它也始终停留在while循环中。有谁知道为什么?
我目前正在使用带有 SAMD21J17 微控制器的 MPLABX。
嗯。我不知道那个特定的编译器,但快速检查一下微芯片编译器 user guide 说了一些我立即跳出来的东西。
您有一个名为中断处理程序的函数,但您没有用装饰器标识它。我建议您查看本指南第 5.8.1 节“编写中断服务程序”,其中说“使用 __interrupt() 说明符编写每个 ISR 原型”。
所以你的例程至少应该是这样的:
void __interrupt(high_priority) interrupt_handler (uintptr_t context) {
flag = true;
}
您需要更改:
bool flag = false;
至:
volatile bool flag = false;
原因是没有volatile
允许编译器假定标志在读取一次后永远不会改变,但您希望它重复读取标志。
我正在尝试等待中断以继续执行代码,如下所示:
bool flag = false;
void interrupt_handler (uintptr_t context)
{
flag = true;
}
void main()
{
CallbackRegister(event, interrupt_handler,0);
while(!flag);
}
但即使发生中断,它也始终停留在while循环中。有谁知道为什么? 我目前正在使用带有 SAMD21J17 微控制器的 MPLABX。
嗯。我不知道那个特定的编译器,但快速检查一下微芯片编译器 user guide 说了一些我立即跳出来的东西。
您有一个名为中断处理程序的函数,但您没有用装饰器标识它。我建议您查看本指南第 5.8.1 节“编写中断服务程序”,其中说“使用 __interrupt() 说明符编写每个 ISR 原型”。
所以你的例程至少应该是这样的:
void __interrupt(high_priority) interrupt_handler (uintptr_t context) {
flag = true;
}
您需要更改:
bool flag = false;
至:
volatile bool flag = false;
原因是没有volatile
允许编译器假定标志在读取一次后永远不会改变,但您希望它重复读取标志。