大家好! 好一段時間沒發文了,其實這半年來小弟我一直在鑽研MCU方面的知識,算是閉關練功吧!沒有新的板子問世深感抱歉!目前在鑽研的平台為安森美的LC823450 Cortex-M3雙核 與IMXRT1050 Cortex-M7單核, 使用的應用情境為ARM主推的神經網路CMSIS-NN,作業系統為ucLinux!
使用的範例為:https://github.com/ARM-software/CMSIS_5/tree/develop/CMSIS/NN/Examples/ARM/arm_nn_examples/cifar10
這個兩個平台都跑的很順!但是當我使用喚醒詞的範例:https://github.com/ARM-software/ML-KWS-for-MCU/tree/master/Deployment/Examples/simple_test
編譯過後執行時一直出現錯誤:cmsis-kws-test: fault at 0x898a2028 [pc=0x81904e60, sp=0x819b2dac]Precise data bus errorSEGV
我stack size已經拉到2MB了,根據ARM的官方文件應該不需要這麼多,請前輩們指點一些方向,我trace一下似乎是做MFCC運算時造成crashed,謝謝!
1)能够反汇编出来 0x898a2028 / pc=0x81904e60, sp=0x819b2dac 对应什么代码么?
2)如果有 debugger, 是否能够在 SEGV 错误之前的指令设断点,看一下当前的 stack usage 情况?
我這沒有JTAG, 對反匯編也沒什麼概念,要先研究一下謝謝
剛用土法煉鋼找到SEGV的點是在DSP/DSP_Lib_TestSuite/RefLibs/src/TransformFunctions/bitreversal.c
底下這個arm_bitreversal_32 api, 執行迴圈的時候錯誤, 會繼續追查下去, 有什麼方向嗎?還是我call錯function了?因為我看到./DSP/Source/TransformFunctions/arm_bitreversal2.S 也有同樣的api但看起來參數不太對,謝謝
找到原因了,我是用CMSIS5的函式庫去套用KWS,但看起來KWS是用CMSIS4去實作的?我降版試試,等我好消息
已解!感謝大大的解惑
已经说了是 Precise data bus error,说明是数据访问错误(不是取指令的问题),有以下几种可能:
1. 数据对齐问题
2. 工程的memory layout和实际硬件的memory layout不一致,表现为,比如工程的 DATA被放在了某个地址上,然而物理硬件上这里实际并没有RAM
3. MPU配置错误
4. 栈溢出或者是出现了野指针——比如堆没有正确初始化,或者堆大小太小)导致C++建立对象失败返回了NULL
建议首先检查memory layout,确保scatter-script和物理硬件对应无误(如果物理硬件有用到SDRAM之类,先检查SDRAM是否在被使用前已经初始化了),其次,检查堆的大小是否正确。
而且这个PC地址(0x81904e60)明显有问题,不像是一个正确的指令所在的位置,建议检查map文件,确认这个地址确实是存放程序的;如果不是存放程序的,那么很大可能性是栈出现了问题,需要检查栈的大小——如果栈大小正确,那么应该考虑是否是bss里面某些指针操作侵入了栈所在的区域——这就需要修改scatter-script来改变栈的位置等等,看看是否现象会改变。