在线时间294 小时
UID416136
注册时间2022-10-3
NXP金币4761
TA的每日心情 | 擦汗 2025-2-21 12:40 |
---|
签到天数: 16 天 连续签到: 1 天 [LV.4]偶尔看看III
金牌会员
 
- 积分
- 3788
- 最后登录
- 2025-9-6
|
本帖最后由 oxlm 于 2023-2-23 22:51 编辑
背景
在添加声卡驱动时,突然遇到了一个问题,运行音频测试程序时,往声卡写数据,audio.c在一个微帧处理完后的下一次微帧处理时会报错,报错内容如下:
- (queue->magic == DATAQUEUE_MAGIC) assertion failed at function:rt_data_queue_peek, line number:336
复制代码
通过查询代码发现,按照正常逻辑,此问题不应该出现。因此怀疑时内存泄漏等原因导致的异常。而按照之前的经验,arm-m核有个很好的跟踪这类问题的工具,cmbacktrace,因此考虑添加该模块做此方面的确认。
开启步骤
1 在“\bsp\lpc55sxx\lpc55s69_nxp_evk”目录下打开env
2. 输入menuconfig,并按enter键
3. 选中RT-Thread Online packages -->tools packages --> CMBacktrace
4. 进入CMBacktrace目录,选择1.4.1版(目前github上最新release版)
5. 保存并退出menuconfig
6. 编写测试代码
- /*
- * Copyright (c) 2006-2023, RT-Thread Development Team
- * Copyright (c) 2019-2020, Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2023-02-23 Liuxiequan First Version
- *
- */
- #include <rtdevice.h>
- #include <stdlib.h>
- #include <string.h>
- rt_thread_t pthread = RT_NULL;
- void test_func(void)
- {
- rt_uint8_t test[1024];
- rt_memset(test, 'x', sizeof(test));
- test[1023] = 0x00;
- rt_kprintf("%s\n", test);
- }
- void test(void *param)
- {
- rt_kprintf("test enter\n");
- test_func();
- while (1)
- {
- rt_thread_mdelay(10);
- }
- }
- int crash_test(int argc, char **argv)
- {
- if (pthread)
- {
- rt_kprintf("thread already created\n");
- return -RT_ERROR;
- }
- pthread = rt_thread_create("crash_test", test, RT_NULL, 512, 20, 10);
- if (pthread)
- {
- rt_thread_startup(pthread);
- }
- }
- MSH_CMD_EXPORT(crash_test, crash_test)
复制代码
7. 运行 “scons --target=mdk5”
8. 编译并下载验证
验证结果
- msh />crash_test
- msh />test enter
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxpsr: 0x0100001e
- r00: 0x0000000d
- r01: 0x78787878
- r02: 0x00007878
- r03: 0x00000000
- r04: 0xdeadbeef
- r05: 0xdeadbeef
- r06: 0xdeadbeef
- r07: 0xdeadbeef
- r08: 0xdeadbeef
- r09: 0xdeadbeef
- r10: 0xdeadbeef
- r11: 0xdeadbeef
- r12: 0x00000000
- lr: 0x000202fd
- pc: 0x00020306
- hard fault on handler
- bus fault:
- SCB_CFSR_BFSR:0x82 PRECISERR SCB->BFAR:7878F0F0
复制代码
结论
RTT已经为M33核适配了CMBacktrace,但很遗憾的是,报错仅停留在错误类型,并未指出是什么位置导致的异常。
在不做继续完善的情况下,可使用该工具做一定程度的协助分析。若需支持异常未知以及前几级的调用链路,可能需要做针对性的适配。
|
|