C语言 任务系统问题 - 任务将恰好运行两次(重新发布一次)



我试图为我的AVR编写一个简单的任务系统。 代码在这里。 (可悲的是,这也是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;
    }

相关内容

  • 没有找到相关文章

最新更新