gpt4 book ai didi

c - ATmega 芯片上的安全 "task switching"

转载 作者:行者123 更新时间:2023-12-04 06:49:57 27 4
gpt4 key购买 nike

我开始在 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

但如果处理程序想要更改 current_screen,我不是 100% 确定这不包含其他一些技巧。也。

有没有更好的方法来处理它?一些好的成语?

最佳答案

您可以使用双缓冲。

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

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

关于c - ATmega 芯片上的安全 "task switching",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3272411/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com