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

主要内容

课程中使用了一个任务与中断间共享的链表来演示所存在的问题。
任务与中断共享资源冲突示例 - 图1
该示例同之前课时中所介绍的资源共享冲突示例类似,都是某一方(此处是任务)在访问资源时被另一方打断(此处是中断),另一方对资源进行了写,导致了资源的访问冲突。所以,在理解这个问题时,可参考对比之前的那些示例。
具体来讲,在任务1中遍历链表:

  1. void listPrint (void) {
  2. uint32_t count = 0;
  3. tNode *currentNode = 0;
  4. // 遍历整个链表,然后打印出各个结点对应的序号
  5. for (currentNode = tListFirst(&list); currentNode != (tNode *) 0; currentNode = tListNext(&list, currentNode)) {
  6. xprintf("Node %d\n", count);
  7. // 假设在此期间,突然发生了中断。由于中断操作了链表,导致再次返回任务时
  8. // 头结点已经从链表中移除。此时,再继续后面的循环发现,currentNode = tListNext(&list, currentNode) 为0
  9. // 导致没有办法再扫描链表中后面的其它结点
  10. if (count++ == 0) {
  11. interruptByIRQ(IRQ_PRIO_HIGH);
  12. }
  13. }
  14. }

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

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

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

重点难点

常见问题