本章介绍任务与中断之间的之间的资源共享问题,同时也讨论 嵌套中断的资源共享。
主要内容
课程中使用了一个任务与中断间共享的链表来演示所存在的问题。
该示例同之前课时中所介绍的资源共享冲突示例类似,都是某一方(此处是任务)在访问资源时被另一方打断(此处是中断),另一方对资源进行了写,导致了资源的访问冲突。所以,在理解这个问题时,可参考对比之前的那些示例。
具体来讲,在任务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);
}
同样的,在实际应用中,这类问题发生的概率可能很小,但如果不解决,更坏地情况下会造成整个系统崩溃。