我开始在 atmega8 上的应用程序中实现类似于任务切换的功能。主要思想是有一个指向“当前屏幕”结构的指针。“当前屏幕”包含用于刷新屏幕、处理按钮和中断的处理程序。
不幸的是,我发现更改函数指针是在 2 次操作中完成的。current_screen->handle_signal(...);
这意味着某些中断可能会在current_screen
部分更改时尝试执行。由于处理精确的时序,我不能在更改期间仅禁用和重新启用中断。设置一个有关正在更改的处理程序的标志可以解决问题,因为我不太关心在任务更改过程中丢失一些中断(但是处理那些我不能错过的中断变得有点困难)。
我考虑在更改期间复制current_screen
到current_screen_old
并设置一个标志,如下所示:
current_screen_old = current_screen; // safe to call current_screen->handler
during_update = 1; // safe to call current_screen_old->handler
current_screen = new_value;
during_update = 0; // safe to call current_screen->handler again
但我不是 100% 确定如果处理程序current_screen
也想更改,这不包含其他一些技巧。
有没有更好的方法来解决它?一些好的成语?