0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

全志R128內(nèi)存泄漏調(diào)試案例分享

冬至子 ? 來(lái)源:丨budboool ? 作者:丨budboool ? 2023-11-20 17:27 ? 次閱讀

問(wèn)題背景

硬件:R128 軟件:FreeRTOS + rtplayer_test(Cedarx)+ AudioSystem

問(wèn)題復(fù)現(xiàn)

復(fù)現(xiàn)步驟:

1.rtplayer_test /data/boot.mp3
2.串口輸入"l", 循環(huán)播放
3.串口輸入"b" , 播放器后臺(tái)執(zhí)行

具體表現(xiàn)

rtplayer_test 循環(huán)播放老化音頻十幾分鐘后,音樂(lè)停止播放,報(bào)錯(cuò)如下:

softvol_ap_update_mode_no_memory.png

問(wèn)題分析

1.根據(jù)上面報(bào)錯(cuò)的log,播放停止時(shí),系統(tǒng)內(nèi)存不足;在老化過(guò)程中出現(xiàn)的內(nèi)存不足,一般是某處存在內(nèi)存泄漏
2.reboot重啟,重新執(zhí)行老化播放流程,串口執(zhí)行free命令,觀察內(nèi)存的剩余情況:

首次播放時(shí)的內(nèi)存:

c906 >free
== > Round [1] <==
Total Heap Size :  1907128 Bytes    ( 1862 KB)
           Free :   547632 Bytes    (  534 KB)
       Min Free :   536208 Bytes    (  523 KB)


      List Task MIN Free Stack(unit: word)
Task          State  Priority  Stack      #
************************************************
Name            State   Pri     HWM     Idx     StkCur          StkBot
adb-shell       X       4       394     44      0x87233a0       0x8722650
AudioDecode     R       4       3872    49      0x874d2c0       0x87459c0
IDLE            R       0       52      2       0x863dfe0       0x863de40
tcpip           B       3       470     12      0x8677ae0       0x8676c30
Demux           B       6       3126    47      0x87333a0       0x872b960
usb-hardware-sc B       6       8018    14      0x871a3a0       0x870a630
adbd-input      B       5       900     24      0x876eb90       0x876cec0
amp-admin       B       6       4002    11      0x8675ab0       0x866dda0
AudioMT2pb      B       4       3882    52      0x8779be0       0x8772050
AudioRender     B       6       3350    50      0x8756950       0x874ed30
amp-ser2        B       6       4006    8       0x865d830       0x8655b00
amp-ser3        B       6       4006    9       0x8665910       0x865dbe0
amp-ser4        B       6       4006    10      0x866d9f0       0x8665cc0
hub-main-thread B       6       8082    13      0x870a2b0       0x86fa620
adbd-shell-ser- B       4       906     45      0x8726330       0x8724660
XPlayer         B       4       3912    48      0x8744e10       0x873d220
AudioMT2        B       4       1907    18      0x873cb00       0x8738e10
RTplayerThread  B       4       3989    51      0x876a630       0x8762980
CLI             B       6       3772    15      0x8722060       0x871a640
Tmr Svc         B       6       374     3       0x863f070       0x863e320
amp-send-task   B       6       930     4       0x8642db0       0x8641070
amp-recv-task   B       6       924     5       0x8644e90       0x8643150
adbd-output     B       5       843     25      0x8770cd0       0x876f060
adb-event       B       5       894     46      0x872a300       0x87286d0
amp-ser0        B       6       4006    6       0x864d670       0x8645940
amp-ser1        B       6       4006    7       0x8655750       0x864da20

播放幾次后的內(nèi)存情況:

c906 >free
== > Round [1] <==
Total Heap Size :  1907128 Bytes    ( 1862 KB)
           Free :   456992 Bytes    (  446 KB)
       Min Free :   453440 Bytes    (  442 KB)


      List Task MIN Free Stack(unit: word)
Task          State  Priority  Stack      #
************************************************
Name            State   Pri     HWM     Idx     StkCur          StkBot
adb-shell       X       4       394     44      0x87235b0       0x8722650
AudioDecode     R       4       3872    49      0x874d5e0       0x87459c0
IDLE            R       0       52      2       0x863dfe0       0x863de40
tcpip           B       3       458     12      0x8677ae0       0x8676c30
usb-hardware-sc B       6       8018    14      0x871a3a0       0x870a630
adbd-input      B       5       900     24      0x876eb90       0x876cec0
amp-admin       B       6       4002    11      0x8675ab0       0x866dda0
AudioMT2pb      B       4       3882    52      0x8779be0       0x8772050
AudioRender     B       6       3350    50      0x8756950       0x874ed30
CLI             B       6       3772    15      0x8722060       0x871a640
Tmr Svc         B       6       374     3       0x863f070       0x863e320
amp-ser0        B       6       4006    6       0x864d670       0x8645940
amp-ser1        B       6       4006    7       0x8655750       0x864da20
amp-ser2        B       6       4006    8       0x865d830       0x8655b00
amp-ser3        B       6       4006    9       0x8665910       0x865dbe0
amp-ser4        B       6       4006    10      0x866d9f0       0x8665cc0
hub-main-thread B       6       8082    13      0x870a2b0       0x86fa620
XPlayer         B       4       3912    48      0x8744e10       0x873d220
AudioMT2        B       4       1907    18      0x873cb00       0x8738e10
adbd-output     B       5       843     25      0x8770cd0       0x876f060
amp-recv-task   B       6       924     5       0x8644e90       0x8643150
Demux           B       6       3126    47      0x8733150       0x872b960
amp-send-task   B       6       924     4       0x8642db0       0x8641070
adb-event       B       5       890     46      0x872a2a0       0x87286d0
adbd-shell-ser- B       4       906     45      0x8726330       0x8724660
RTplayerThread  B       4       3989    51      0x876a630       0x8762980

觀察Free項(xiàng)的剩余內(nèi)存,可發(fā)現(xiàn)在老化播放過(guò)程中,內(nèi)存不斷減少,存在泄漏。

泄漏點(diǎn)定位

可借助memleak工具,定位內(nèi)存泄漏處。mrtos menuconfig選上memleak

- > System components                                                                    
 - > aw components                                                                         
  - > Memleak Components Support   
    [*] Tina RTOS Memleak                    # 使能內(nèi)存泄露分析工具
    (16)  Tina RTOS Memleak Backtrace Level  # 內(nèi)存泄露分析?;厮輰訑?shù)                 
    []   Tina RTOS Double Free Check

memleak用法如下

作用:內(nèi)存泄露分析

用法:memleak 1 使能內(nèi)存泄露分析,記錄所有內(nèi)存塊申請(qǐng)、釋放信息
memleak 0 關(guān)閉內(nèi)存泄露分析,刪除所有內(nèi)存塊的申請(qǐng)、釋放信息
memleak 1 thread_name1 thread_name2 使能內(nèi)存泄露分析,記錄指定任務(wù)的內(nèi)存塊申請(qǐng)、釋放信息

串口執(zhí)行memleak 1

音頻老化測(cè)試(參考復(fù)現(xiàn)步驟),音頻播放幾次后,執(zhí)行rtpc q 命令退出播放

串口執(zhí)行memleak 0

關(guān)閉內(nèi)存泄露檢測(cè)時(shí),會(huì)打印可疑的內(nèi)存泄露點(diǎn)及其回溯信息;

有兩個(gè)地方:

007: ptr = 0x08760960, size = 0x00000f00, thread = AudioRender
        backtrace : 0x08336AEE
        backtrace : 0x08336B46
        backtrace : 0x08396D52
        backtrace : 0x084B025E
        backtrace : 0x08446856
        backtrace : 0x084496C6
    008: ptr = 0x0875f990, size = 0x00000f00, thread = AudioRender
        backtrace : 0x08336AEE
        backtrace : 0x08336B46
        backtrace : 0x0839757E
        backtrace : 0x084B025E
        backtrace : 0x08446856
        backtrace : 0x084496C6

callstack 回溯

pvPortMalloc at /workspace/freertos/r128/test_0624_rtplayer/rtos-dev/lichee/rtos/kernel/FreeRTOS-orig/Source/portable/MemMang/heap_4.c:658
pvPortCalloc at /workspace/freertos/r128/test_0624_rtplayer/rtos-dev/lichee/rtos/kernel/FreeRTOS-orig/Source/portable/MemMang/heap_4.c:577
softvol_ap_update_mode at /workspace/freertos/r128/test_0624_rtplayer/rtos-dev/lichee/rtos/components/common/aw/AudioSystem/audio_plugin/softvolume.c:250
_AudioTrackStart at //workspace/rtos-r128/lichee/rtos/components/common/aw/AudioSystem/AudioTrack.c:163
RTSoundDeviceStart at /workspace/codec_lib/cedarx_rtos/temp/rtos_cedarx/cedarx/rtos_out/libcore/playback/src/rtosSoundControl.c:766
startSoundDevice at /workspace/codec_lib/cedarx_rtos/temp/rtos_cedarx/cedarx/rtos_out/libcore/playback/src/audioRenderComponent.c:800
 (inlined by) doRender at /workspace/codec_lib/cedarx_rtos/temp/rtos_cedarx/cedarx/rtos_out/libcore/playback/src/audioRenderComponent.c:942
 (inlined by) doRender at /workspace/codec_lib/cedarx_rtos/temp/rtos_cedarx/cedarx/rtos_out/libcore/playback/src/audioRenderComponent.c:898

通過(guò)回溯信息,發(fā)現(xiàn)在resample_ap_update_mode處產(chǎn)生了內(nèi)存泄漏。

根本原因

播放器老化過(guò)程中,只調(diào)用AudioTrackCreate一次,循環(huán)播放時(shí)會(huì)多次調(diào)用_AudioTrackStart,最后退出播放才調(diào)用AudioTrackDestroy銷毀;所以softvol_ap_update_mode這里,老化過(guò)程會(huì)多次調(diào)用到,會(huì)有多次分配,但只在退出時(shí)AudioTrackDestroy里才銷毀。

解決方法

只在AudioTrackCreateWithStream時(shí)創(chuàng)建一次,AudioTrackDestroy,測(cè)試10小時(shí)左右未出現(xiàn)內(nèi)存泄漏

AudioTrack_soft.png

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    483

    瀏覽量

    61915
  • ADB驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    6259
  • R128
    +關(guān)注

    關(guān)注

    0

    文章

    41

    瀏覽量

    93
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    使用R128實(shí)現(xiàn)LVGL的移植

    我們使用的開(kāi)發(fā)板是 R128-Devkit,需要開(kāi)發(fā) C906 核心的應(yīng)用程序,所以載入方案選擇 r128s2_module_c906
    的頭像 發(fā)表于 11-13 10:14 ?1481次閱讀
    使用<b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>R128</b>實(shí)現(xiàn)LVGL的移植

    R128應(yīng)用開(kāi)發(fā)案例—獲取真隨機(jī)數(shù)

    R128 內(nèi)置了TRNG,一個(gè)真隨機(jī)數(shù)發(fā)生器,隨機(jī)源是 8 路獨(dú)立的環(huán)形振蕩器
    的頭像 發(fā)表于 10-24 17:49 ?928次閱讀
    <b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>R128</b>應(yīng)用開(kāi)發(fā)案例—獲取真隨機(jī)數(shù)

    R128 BLE最高吞吐量測(cè)試正確配置測(cè)試方法

    R128使用前我們需要了解BLE的最高吞吐量,以方便評(píng)估相關(guān)功能的開(kāi)發(fā)。
    的頭像 發(fā)表于 10-27 17:17 ?1245次閱讀
    <b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>R128</b> BLE最高吞吐量測(cè)試正確配置測(cè)試方法

    R128應(yīng)用開(kāi)發(fā)案例—適配SPI驅(qū)動(dòng)ST7789V2.4寸LCD

    R128 平臺(tái)提供了 SPI DBI 的 SPI TFT 接口,具有如下特點(diǎn)
    的頭像 發(fā)表于 11-02 16:44 ?878次閱讀
    <b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>R128</b>應(yīng)用開(kāi)發(fā)案例—適配SPI驅(qū)動(dòng)ST7789V2.4寸LCD

    詳解R128 RTOS安全方案功能

    介紹 R128 下安全方案的功能。安全完整的方案基于標(biāo)準(zhǔn)方案擴(kuò)展,覆蓋硬件安全、硬件加解密引擎、安全啟動(dòng)、安全系統(tǒng)、安全存儲(chǔ)等方面。 配置文件相關(guān)本文涉及到一些配置文件,在此進(jìn)行說(shuō)明。 env
    發(fā)表于 12-28 15:59

    R128 DSP開(kāi)發(fā)工具安裝教程

    下的 dsp_raw.bin 拷貝到 R128 根SDK 下的 board/r128s/xxx/bin/ 下,并重命名為rtos_dsp_sun20iw2p1.fex。 R128 SDK 下重新打包燒錄,即可
    發(fā)表于 12-28 17:21

    R128入門編寫HelloWorld

    本文將介紹使用 R128 開(kāi)發(fā)板從串口輸出 HelloWorld 的方式介紹 SDK 軟件開(kāi)發(fā)流程。 載入方案我們使用的開(kāi)發(fā)板是 R128-Devkit,需要開(kāi)發(fā) C906 核心的應(yīng)用程序,所以載入
    發(fā)表于 12-29 09:39

    R128硬件設(shè)計(jì)指南①

    ; RESET Pin放置 1nF電容。 DEBUG電路設(shè)計(jì)R128支持 USB(OTG)、UART、JTAG與 SWD 等多種調(diào)試方式,客戶可根據(jù)需要選擇合適的調(diào)試方式,建議在設(shè)計(jì)時(shí)對(duì)相應(yīng)的
    發(fā)表于 01-04 09:23

    R128 SDK架構(gòu)與目錄結(jié)構(gòu)

    R128 S2 是提供的一款 M33(ARM)+C906(RISCV-64)+HIFI5(Xtensa) 三核異構(gòu) SoC,同時(shí)芯片內(nèi)部 SIP 有 1M SRAM、8M LSPSRAM、8M
    發(fā)表于 01-05 10:05

    R128 Devkit開(kāi)發(fā)板原理圖模塊介紹及使用說(shuō)明

    :CH341SER.EXE 購(gòu)買鏈接 百問(wèn)科技淘寶店 - R128 DevKit 原理圖模塊介紹R128 模組R128 模組使用 SMT
    發(fā)表于 01-17 09:45

    R128內(nèi)存泄漏調(diào)試案例

    內(nèi)存泄露調(diào)試案例 問(wèn)題背景 硬件:R128 軟件:FreeRTOS + rtplayer_test(Cedarx)+ AudioSystem 問(wèn)題復(fù)現(xiàn) 復(fù)現(xiàn)步驟: rtplayer_test
    發(fā)表于 11-20 16:54

    R128內(nèi)存泄露調(diào)試案例

    內(nèi)存泄露調(diào)試案例 問(wèn)題背景 硬件:R128 軟件:FreeRTOS + rtplayer_test(Cedarx)+ AudioSystem 問(wèn)題復(fù)現(xiàn) 復(fù)現(xiàn)步驟: rtplayer_test
    發(fā)表于 12-11 10:57

    R128適配ST7789v LCD

    R128 平臺(tái)提供了 SPI DBI 的 SPI TFT 接口,具有如下特點(diǎn)
    的頭像 發(fā)表于 10-23 11:26 ?903次閱讀
    <b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>R128</b>適配ST7789v LCD

    R128啟用USB ADB以及無(wú)線ADB配置方法

    首先在FreeRTOS的環(huán)境下,選擇r128\_c906\_pro
    的頭像 發(fā)表于 11-01 11:43 ?1097次閱讀
    <b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>R128</b>啟用USB ADB以及無(wú)線ADB配置方法

    DshanMCU-R128s2 R128 EVT 開(kāi)發(fā)套件

    針對(duì) R128 模組,百問(wèn)科技推出了 R128 EVT 開(kāi)發(fā)套件作為快速開(kāi)發(fā)評(píng)估工具。
    的頭像 發(fā)表于 12-22 15:16 ?718次閱讀
    DshanMCU-<b class='flag-5'>R128</b>s2 <b class='flag-5'>R128</b> EVT 開(kāi)發(fā)套件