【发布时间】:2015-08-18 10:09:17
【问题描述】:
我正在编写 Linux 设备驱动程序代码。我无法透露此代码的确切用途。我会尽力解释我的情况。当我们收到一个 USB 中断表明有一些来自 USB 的数据时,下面的代码将在中断上下文中执行。数据将作为 URB 到达,我们会将它们转换为块,将它们添加到 Linux 循环双向链表中以进行进一步处理。
spin_lock(&demod->demod_lock);
/* Delete node from free list */
list_del(&chunk->list_head);
/* Add it to full list */
list_add_tail(&chunk->list_head,&demod->ChunkRefList.full);
/* Update chunk status */
chunk->status=CHUNKDESC_FULL_LIST;
/* Increment the chunks assigned to application */
demod->stats.assigned.c++;
spin_unlock(&demod->demod_lock);
printk("Value returned by list_empty is %d ",list_empty(&demod->ChunkRefList.full));
我再说一遍,这段代码在中断上下文中执行。我将此代码用作嵌入式系统的一部分,它永远显示音频和视频(AV)。
大约 12 小时后,AV 被冻结,当我分析时,我看到返回的 list_empty(&demod->ChunkRefList.full) 的值永远是 0x1。通常在 AV 播放正常的情况下,其值为 0x0,表示列表不为空。
如您所见,当执行上述代码时,它首先将一个节点添加到完整列表并检查完整列表是否为空。理想情况下,该值应始终为 0x0。为什么它的值为0x1
我正在使用不会在中断上下文中引入任何开销的 timedoctor 应用程序监视 list_empty(&demod->ChunkRefList.full) 的值。我在上面使用了 printk 来让你明白我正在打印它的值。
【问题讨论】: