gpt4 book ai didi

c - 任务系统问题 - 任务将运行两次(重新发布一次)

转载 作者:行者123 更新时间:2023-11-30 17:48:10 27 4
gpt4 key购买 nike

我尝试为我的 AVR 编写一个简单的任务系统。其代码是 here 。 (遗憾的是,这也是 MWE。)

系统背后的基本思想是,周期性定时器中断设置一个标志,然后主应用程序循环检查该标志以运行任务。任务处理函数是可重入的,因此每个待处理任务的每次迭代都会执行一次:

while (1) {
if (flTask) {
flTask = task_process_next();
}

// Do other awesome stuff in the loop
}

为了保持设计简单,需要定期运行的任务需要重新发布自身。

因此可以添加一个简单的心跳任务,如下所示:

task_add(heartbeat_task, 0);

它的代码可能如下所示:

void heartbeat_task(void)
{
task_add(heartbeat_task, 10000); // Re-post task

led_toggle(LEDGreen);
xbee_send_heartbeat(BASE_STATION_ID);
}
<小时/>

我的问题是这样的:每个定期任务将恰好运行两次。

我已经通过切换引脚(正如您在我链接的代码中看到的那样)确认,在每个任务的第一次和重复执行期间,都会调用 task_add 方法。

但是,尽管显然是第二次添加该任务,但它从未运行。

我进一步尝试大大简化 task_process_next 中的代码(包括添加一个循环来处理一次调用中的所有任务,以及更改运行条件以忽略溢出)。这些修改都没有成功。

<小时/>

我的问题是这样的:我是否搞乱了链接列表实现的一些细节,这可能会导致重新发布的任务被忽略?

特别是,我是否不小心这样做了,以便可以跳过列表中的节点而不进行评估或运行?

我知道如果不在硬件上运行就很难调试此类问题,但我希望另一双眼睛能看到我错过的东西。

我很乐意提供任何其他信息/进行任何必要的测试。

最佳答案

当队列末尾的任务被删除时,队列被损坏:

    if (prev) {
prev->next = task->next;
} else {
tasks.head = task->next;
}

// Adding these lines fixed the problem
if (task == tasks.tail) {
tasks.tail = prev;
}

关于c - 任务系统问题 - 任务将运行两次(重新发布一次),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18689342/

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