1. 缘起
偶然一次听泽哥说对于出现crash的这种问题,bl616/618的芯片我们可以配置让他生成core dump文件。这样我们使用gdb 调试core dump文件就可以找到crash的原因了。
这个过程听起来和内核调试一毛一样。单片机强大到这样吗?带着这样的疑问,问了泽哥,泽哥说只要makefile中配置上就可以通过串口打印出来core dump。就像下面这样:
2. 尝试
带着好奇,我打开aithinker_Ai-M6X_SDK\examples\helloworld,刻意的制造了一个crash。编译烧录后发现并没有core dump的生成。
泽哥又说需要在使用FreeRTOS的时候, 才有用。遂简单的将代码放在了task中。
#include "bflb_mtimer.h"
#include "board.h"
#include <FreeRTOS.h>
#include "task.h"
#define DBG_TAG "MAIN"
#include "log.h"
#define STACK_SIZE (1536)
#define TASK_PRIORITY (16)
static TaskHandle_t crash_task_hd;
void crash_task(void *params)
{
char* pBuffer = 0x80000000;
uint32_t i = 0;
while(1)
{
pBuffer[i] = i++;
printf("%d\r\n", pBuffer[i]);
bflb_mtimer_delay_ms(500);
}
}
int main(void)
{
board_init();
xTaskCreate(crash_task, "crash_task", STACK_SIZE, NULL, TASK_PRIORITY, &crash_task_hd);
vTaskStartScheduler();
while (1) {
}
}
再次编译烧录,还是没有core dump生成。
3. 溯源
上班的路上我就在想,这些配置无非都是作用到gcc 编译参数上的,我追寻下这个core_dump的配置参数不就知道原因了吗?
当我打开aithinker_Ai-M6X_SDK,在里面搜了下关于coredump的参数解析的,竟然没有找到!
这就能解释了,这个配置项人家压根都没有关注,咱们在上层一通配置肯定啥也不是啊。但是泽哥说这个能用,难道是我的SDK太老了?但是看了下安信可官方github上也没有更新sdk呀!
那我就转向了博流的SDK。打开就直接找到了相关内容了:
至此,破案了。想要使用core_dump, 那就用bl_sdk,或者把bl_sdk中的core_dump引用过来。 |