87894


Spresense SDK Examples の audio_pcm_capture を20回程度、繰り返し実行すると、下記の Assertion
failed が発生します。

Build環境；Windows 10 + VS Code + Spresense 拡張機能 * Msys2  
SDK バージョン：Spresense SDK 2.4.0  
audio_pcm_captureは、SDKのコンフィグ時に当該機能を選択しただけで、ソースコードに手は入れていません。

実行コマンドは次のとおりです。

[code]

    nsh> audio_pcm_capture 48k 1ch 16bit 1
    
[/code]

1回の実行終了を待って、続けて同コマンドを数十回実行します。

回避方法をご存知の方がいらっしゃいましたらご教授ください。

[code]

    up_assert: Assertion failed at file:dma_controller/audio_dma_drv.cpp line: 975 task: capture0
    up_registerdump: R0: 00000001 2d04bc68 000000e0 2d0a95e0 2d04bc68 2d0bbb00 2d0a95cc 00000000
    up_registerdump: R8: 0d040240 000003cf 2d0bb220 00000000 00000000 2d0bbb00 0d0086e5 0d008d38
    up_registerdump: xPSR: 61000000 BASEPRI: 000000e0 CONTROL: 00000004
    up_registerdump: EXC_RETURN: ffffffe9
    up_dumpstate: sp:     2d0bbb00
    up_dumpstate: IRQ stack:
    up_dumpstate:   base: 2d04ac28
    up_dumpstate:   size: 00000800
    up_dumpstate:   used: 000000f8
    up_dumpstate: User stack:
    up_dumpstate:   base: 2d0bbbe8
    up_dumpstate:   size: 00000800
    up_dumpstate:   used: 00000284
    up_stackdump: 2d0bbb00: 000000e0 00000004 00000000 00000000 2d0bbb00 0d0086e5 0d008d38 0d003fd7
    up_stackdump: 2d0bbb20: 2d0aa1dc 2d0bbc10 00000000 00000000 00000000 00000000 00000000 00000000
    up_stackdump: 2d0bbb40: 00000000 0d006b11 00000001 0d02971d 2d0bbc10 0d029359 2d0a8eec 00000001
    up_stackdump: 2d0bbb60: 2d0baf90 0d02939f 2d0baf90 0d028ab9 2d0bb3b0 0d003fcb 000fd140 0102925d
    up_stackdump: 2d0bbb80: 00000000 000fde88 2d0bbb90 0d02837f 00000000 00030000 0d0406c8 2d0a8f6c
    up_stackdump: 2d0bbba0: 2d0ae4a4 2d0baf90 2d0bb3b0 2d0ae490 2d0ae4a4 0d028e1b 000fd140 000fde88
    up_stackdump: 2d0bbbc0: 2d0bb220 0d028e69 0d028e47 0d01f29f 00000000 00000000 00000000 00000000
    up_stackdump: 2d0bbbe0: 00000000 00000000 00000020 80000820 00780077 007a0079 0000007b 80000010
    up_taskdump: Idle Task: PID=0 Stack Used=464 of 1024
    up_taskdump: hpwork: PID=1 Stack Used=556 of 2008
    up_taskdump: lpwork: PID=2 Stack Used=332 of 2008
    up_taskdump: lpwork: PID=3 Stack Used=332 of 2008
    up_taskdump: lpwork: PID=4 Stack Used=332 of 2008
    up_taskdump: cxd56_pm_task: PID=6 Stack Used=400 of 976
    up_taskdump: init: PID=7 Stack Used=1188 of 8152
    up_taskdump: audio_pcm_capture: PID=119 Stack Used=780 of 1960
    up_taskdump: audio_manager: PID=120 Stack Used=700 of 2048
    up_taskdump: front_end: PID=121 Stack Used=500 of 2048
    up_taskdump: media_recorder: PID=122 Stack Used=344 of 2048
    up_taskdump: capture0: PID=123 Stack Used=700 of 2048
    
[/code]


CC BY-SA 4.0
2022-03-14T08:56:35.947
86831
2022-03-18T05:15:43.683
2022-03-14T10:08:03.990
32986
51819
question
spresense
Spresense SDK Examples の audio_pcm_capture を繰り返し実行すると Assertion failed…audio_dma_drv.cpp line: 975… が発生します


回避方法が分かったので回答します。

TIPSとして、NuttShell プロンプトから `free` コマンドを実行すると、  
malloc/freeで使用されるヒープ領域の状態を確認することができます。

コマンド例:

[code]

    nsh> free
                         total       used       free    largest
            Umem:       122416      53664      68752      59120
    
[/code]

SDKv2.4.0の最新バージョンで、`audio_pcm_capture` コマンドを実行/終了するたびに `free`
コマンドでヒープ領域を確認してみると、`used`使用容量が増えていき、`free`残容量が減っていくことが分かりました。いわゆるメモリリークの問題が起きてそうです。

続いて、開発ブランチ(`develop`ブランチ)を使って試してみました。すると、100回以上繰り返し実行しても特にこの問題は発生しませんでした。開発ブランチ上のどこかでこの問題は修正済みのようです。

さらに`develop`ブランチの中身を調べていって、以下のcommitを見つけました。

これが該当してそうです。  
<https://github.com/sonydevworld/spresense/pull/354>

この変更を取り込むか、もしくは、開発ブランチを使用することでこの問題を回避できそうです。


CC BY-SA 4.0
2022-03-18T05:15:43.683
87894
2022-03-18T05:15:43.683
31378
86831
answer