手把手教你学用嵌入式操作系统

  1. 主页
  2. 手把手教你学用嵌入式操作系统
  3. 第3章 任务中断间的共享资源保护
  4. 任务与中断共享资源冲突示例

任务与中断共享资源冲突示例

内容纲要

本章介绍任务与中断之间的之间的资源共享问题,同时也讨论 嵌套中断的资源共享。

主要内容

课程中使用了一个任务与中断间共享的链表来演示所存在的问题。

该示例同之前课时中所介绍的资源共享冲突示例类似,都是某一方(此处是任务)在访问资源时被另一方打断(此处是中断),另一方对资源进行了写,导致了资源的访问冲突。所以,在理解这个问题时,可参考对比之前的那些示例。

具体来讲,在任务1中遍历链表:

void listPrint (void) {
    uint32_t count = 0;
    tNode *currentNode = 0;

    // 遍历整个链表,然后打印出各个结点对应的序号
    for (currentNode = tListFirst(&list); currentNode != (tNode *) 0; currentNode = tListNext(&list, currentNode)) {
        xprintf("Node %d\n", count);

        // 假设在此期间,突然发生了中断。由于中断操作了链表,导致再次返回任务时
        // 头结点已经从链表中移除。此时,再继续后面的循环发现,currentNode = tListNext(&list, currentNode) 为0
        // 导致没有办法再扫描链表中后面的其它结点
        if (count++ == 0) {
            interruptByIRQ(IRQ_PRIO_HIGH);
        }
    }
}

遍历过程中被中断打断,中断中对链表中的结点进行了删除操作,导致返回任务1执行时,任务的遍历过程中出现异常。

void IRQHighHandler (void) {
    // 在中断中,可能会访问链表,然后对链表进行一些修改操作
    // 比如删除第1个。而如果此时任务恰好在访问第1个结点,则会链表访问混乱,出现错误
    tListRemoveFirst(&list);
}

同样的,在实际应用中,这类问题发生的概率可能很小,但如果不解决,更坏地情况下会造成整个系统崩溃。

重点难点

常见问题

这篇文章对您有用吗?

我们要如何帮助您?

发表评论

电子邮件地址不会被公开。 必填项已用*标注