首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ATmega芯片上的安全“任务切换”

ATmega芯片上的安全“任务切换”
EN

Stack Overflow用户
提问于 2010-07-18 00:55:33
回答 1查看 451关注 0票数 2

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

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

我想过在更改期间将current_screen复制到current_screen_old,并设置一个标志,如下所示:

代码语言:javascript
复制
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%确定这不包含一些其他技巧。

有没有更好的方法来解决这个问题?一些好的习惯用法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-18 01:48:00

您可以使用双缓冲。

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

您需要确保在更改期间访问指针的任何任务都不会被挂起足够长的时间,从而不会被下一个更改干扰。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3272411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档