|
在zephyr系统中,应用层有时存在多个线程运行的情况,如果某个线程堆栈分配内存比较小,可能存在溢出的风险。
直接的表现就是“HARD FAULT” (如果看门狗开了就会复位)
分析流程: 在配置文件(prj.conf)里面打开LOG输出,加入下面两条指令
默认你的串口已经打开,如果没有请设置对应的配置,另外开了看门狗的话也先关闭
CONFIG_LOG=y
CONFIG_LOG_DEFAULT_LEVEL=1
然后编译烧录后观察异常后,串口有没有打印hard fault相关信息,我这个线程堆栈溢出的信息如下:
[17:30:03.447]收←◆[00:00:14.024,000] [1;31m<err> os: ***** HARD FAULT *****[0m
[00:00:14.024,000] [1;31m<err> os: ARCH_EXCEPT with reason 2
[0m
[00:00:14.024,000] [1;31m<err> os: r0/a1: 0x00000002 r1/a2: 0x000f0758 r2/a3: 0xf0f0f0f0[0m
[00:00:14.024,000] [1;31m<err> os: r3/a4: 0x200085f8 r12/ip: 0x0003b401 r14/lr: 0x0003b417[0m
[00:00:14.024,000] [1;31m<err> os: xpsr: 0x0100001d[0m
[00:00:14.024,000] [1;31m<err> os: Faulting instruction address (r15/pc): 0x000453e0[0m
[00:00:14.024,000] [1;31m<err> os: >>> ZEPHYR FATAL ERROR 2: Stack overflow on CPU 0[0m
[00:00:14.024,000] [1;31m<err> os: Fault during interrupt handling
[0m
[00:00:14.024,000] [1;31m<err> os: Current thread: 0x200038a0 (unknown)[0m
[00:00:14.086,000] [1;31m<err> os: Halting system[0m
从上面信息可以看到异常的原因是“tack overflow”, 并且当前的线程位于“ 0x200038a0 ”。
异常的线程信息我们可以从工程编译后输出目录中的zephyr.map文件中找到。
(使用我们ZAL工具的“Open Output Folder” 按钮可以直接跳转到输出目录,具体目录位于 01_SDK\build\工程名\zephyr)
具体每个线程的栈资源应该设置多大,可以参考这个文档进行测试
https://docs.panchip.com/pan1080dk-doc/latest/docs-zdk/04_dev_guides/zephyr_ram_analysis_guidance.html
|
|