c++ - "BUG: scheduling while atomic?"的可能原因有哪些

标签 c++ embedded-linux

还有另外一个进程不断地创建需要这段代码处理的文件。 此代码通过将文件系统的内容与包含处理结果的 sqlite 数据库进行比较,不断扫描文件系统以查找需要处理的新文件 - 每个文件一个记录。此进程以 nice -n 19 运行,以免干扰其他进程创建新文件。 对于大量 (>1k) 文件,这一切都完美无缺,但随后会因 BUG: scheduling while atomic 而崩溃。 根据this

"Scheduling while atomic" indicates that you've tried to sleep somewhere that you shouldn't

但是代码中唯一的sleep是这样的

void doFiles(void) {
    for (...) { // for each file in the file-system
        ... // check database - do processing if needed
    }
    sleep(1);
}
int main(int argc, char *argv[], char *envp[]) {
    while (true) doFiles();
    return -1;
}

代码将在根据数据库检查文件系统中的每个文件后进入休眠状态。由于会不时添加新文件,因此需要重复该过程。此代码中没有多线程。除了错位的 sleep 之外,是否还有其他可能导致“BUG:原子调度”的原因?

编辑:额外的错误输出:

note: mirlin[1083] exited with preempt_count 1
BUG: scheduling while atomic: mirlin/1083/0x40000002
Modules linked in: g_cdc_ms musb_hdrc nop_usb_xceiv irqk edmak dm365mmap cmemk
Backtrace: 
[<c002a5a0>] (dump_backtrace+0x0/0x110) from [<c028e56c>] (dump_stack+0x18/0x1c)
 r6:c1099460 r5:c04ea000 r4:00000000 r3:20000013
[<c028e554>] (dump_stack+0x0/0x1c) from [<c00337b8>] (__schedule_bug+0x58/0x64)
[<c0033760>] (__schedule_bug+0x0/0x64) from [<c028e864>] (schedule+0x84/0x378)
 r4:c10992c0 r3:00000000
[<c028e7e0>] (schedule+0x0/0x378) from [<c0033a80>] (__cond_resched+0x28/0x38)
[<c0033a58>] (__cond_resched+0x0/0x38) from [<c028ec6c>] (_cond_resched+0x34/0x44)
 r4:00013000 r3:00000001
[<c028ec38>] (_cond_resched+0x0/0x44) from [<c0082f64>] (unmap_vmas+0x570/0x620)
[<c00829f4>] (unmap_vmas+0x0/0x620) from [<c0085c10>] (exit_mmap+0xc0/0x1ec)
[<c0085b50>] (exit_mmap+0x0/0x1ec) from [<c0037610>] (mmput+0x40/0xfc)
 r9:00000001 r8:80000005 r6:c04ea000 r5:00000000 r4:c0427300
[<c00375d0>] (mmput+0x0/0xfc) from [<c003b5e4>] (exit_mm+0x150/0x158)
 r5:c10992c0 r4:c0427300
[<c003b494>] (exit_mm+0x0/0x158) from [<c003cd44>] (do_exit+0x198/0x67c)
 r7:c03120d1 r6:c10992c0 r5:0000000b r4:c10992c0
...

最佳答案

正如其他人所说,您可以随时在用户代码中使用 sleep()。

您平台上的驱动程序似乎有问题。驱动程序实际上可能不会调用 sleep() 或 schedule(),但它通常会调用内核函数,而内核函数又会调用其中一个函数。

这看起来也像是在嵌入式 TI ARM 处理器上使用内存映射文件 I/O。

关于c++ - "BUG: scheduling while atomic?"的可能原因有哪些,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14903360/

相关文章:

c++ - 模板化和非模板化类的可变参数模板方法行为的令人费解的差异

c++ - 按字母顺序返回文件中的单词

linux - 鼠标和键盘在 qemu 模拟器中不工作

linux - 如何在 uboot 期间启用 dm 365 上的启动屏幕?

linux - 主机 : Test connectivity to wifi network on different channel than ap interface

C++ 多维数组和指针名称括号

C++ 如何使以有序方式读取和存储 100 个字符的二维数组 [500][500] 成为可能?

c++ - C++ 中分离线程的资源释放

c - 我如何知道可执行文件中有哪些功能?

linux - 如何在不同的驱动程序之间共享设备树节点中的信息