我开始在我的atmega8应用程序中实现类似于任务切换的东西。其主要思想是有一个指向“当前屏幕”结构的指针。“当前屏幕”包含用于刷新屏幕、处理按钮和中断的处理程序。
不幸的是,我发现改变函数指针是在两个操作中完成的。这意味着当current_screen部分改变时,一些中断可能会尝试执行current_screen->handle_signal(...);。由于处理精确的时序,我不能在更改期间禁用和重新启用中断。设置一个关于正在改变的处理程序的标志可以做到这一点,因为我并不太关心在任务改变的过程中错过一些中断(但是处理那些我不能错过的中断就变得有点困难了)。
我想过在更改期间将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但是,如果处理程序也想更改current_screen,我不能100%确定这不包含一些其他技巧。
有没有更好的方法来解决这个问题?一些好的习惯用法?
发布于 2010-07-18 01:48:00
您可以使用双缓冲。
也就是说,使用一个包含两个函数指针的数组和一个指向当前函数指针的索引。将非当前指针设置为新值,然后切换索引。因为索引是小的(0或1)设置,所以它是原子的。
您需要确保在更改期间访问指针的任何任务都不会被挂起足够长的时间,从而不会被下一个更改干扰。
https://stackoverflow.com/questions/3272411
复制相似问题