2

我开始在 atmega8 上的应用程序中实现类似于任务切换的功能。主要思想是有一个指向“当前屏幕”结构的指针。“当前屏幕”包含用于刷新屏幕、处理按钮和中断的处理程序。

不幸的是,我发现更改函数指针是在 2 次操作中完成的。current_screen->handle_signal(...);这意味着某些中断可能会在current_screen部分更改时尝试执行。由于处理精确的时序,我不能在更改期间仅禁用和重新启用中断。设置一个有关正在更改的处理程序的标志可以解决问题,因为我不太关心在任务更改过程中丢失一些中断(但是处理那些我不能错过的中断变得有点困难)。

我考虑在更改期间复制current_screencurrent_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也想更改,这不包含其他一些技巧。

有没有更好的方法来解决它?一些好的成语?

4

1 回答 1

3

您可以使用双缓冲。

也就是说,使用包含两个函数指针的数组和指向当前函数指针的索引。将非当前指针设置为新值,然后切换索引。由于索引很小(0或1)设置它是原子的。

您需要确保在更改期间访问指针的任何任务都不会被暂停足够长的时间以受到下一次更改的干扰。

于 2010-07-17T17:48:00.200 回答