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

标签 c linked-list avr

我尝试为我的 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/

相关文章:

c - 在函数中使用#define

c - 为什么我在 Windows COM 端口上的串行读取限制为 8192 字节?

char* 指向文字字符串(在源代码中硬连线)可以吗?

c - 为什么这个打印链表功能不起作用?

llvm - 如何告诉 clang 不要将寄存器保存到堆栈?

c - 将 C 代码中的调试文本打印到 Lauterbach TRACE32

java - 如何从链表中删除素数

在c中创建n个链表

c - 为什么生成此代码以取消引用浮点指针?

arduino - STK500v2 引导加载程序仅在上电复位时加载,而不是在引脚/WDT 复位时加载