3

このコードによる処理が必要なファイルを継続的に作成する別のプロセスがあります。このコードは、ファイルシステムの内容を、処理結果を含​​むsqliteデータベース(ファイルごとに1つのレコード)と比較することにより、処理が必要な新しいファイルがないかファイルシステムを常にスキャンします。このプロセスはnice -n 19、他のプロセスによる新しいファイルの作成を妨げないように実行されています。多数(> 1k)のファイルに対してはすべて完全に機能しますが、その後は。で爆発しBUG: scheduling while atomicます。これによると

「アトミック中のスケジューリング」は、あなたが眠るべきではない場所で眠ろうとしたことを示します

しかし、コード内の唯一のスリープはこのようなものです

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;
}

ファイルシステム内のすべてのファイルをデータベースと照合した後、コードはこのスリープ状態になります。新しいファイルが時々追加されるため、このプロセスを繰り返す必要があります。このコードにはマルチスレッドはありません。睡眠の置き忘れ以外に、「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
...
4

2 に答える 2

2

他の人が言っているように、ユーザーコードでいつでもsleep()を実行できます。

プラットフォーム上のドライバーに問題があるようです。ドライバーは実際にはsleep()またはschedule()を呼び出さない場合がありますが、多くの場合、カーネル関数を呼び出して、これらのいずれかを呼び出します。

これは、組み込みTIARMプロセッサでメモリマップトファイルI/Oを使用しているようにも見えます。

于 2013-02-15T23:34:40.340 に答える
-2

このエラーは、ビルドが正しくないことが原因で発生しました。クリーンビルド自体は役に立ちませんでした。この問題を解決するには、新しいチェックアウトとビルドが必要でした。

于 2013-02-20T13:11:36.073 に答える