LVGL显示gif动图导致MCU进入HardFault_Handler问题(已解决!)

LVGL问题源码:

复制代码
/* list item click */
static void list_btn_event_cb(lv_event_t * e)
{
	
    const char * name = (const char *)lv_event_get_user_data(e);
    if(!name) return;

    char full[FB_PATH_MAX];
    if(fb_current_path[strlen(fb_current_path)-1] == '/')
        sprintf(full,"%s%s", fb_current_path, name);
    else
        sprintf(full,"%s/%s", fb_current_path, name);
	
    FILINFO fi;
    if(f_stat(full, &fi) != FR_OK) return;
	printf("list item click :%s\r\n",full);
    if(fi.fattrib & AM_DIR) 
	{
		fb_open(full);/* 打开目录 */
    }
	else 
	{
		//printf("list item click :%s\r\n",full);
        /* file: handle based on extension */
        const char * ext = strrchr(full, '.');
        if( ext && (strcasecmp(ext, ".bmp")==0 || strcasecmp(ext, ".png")==0 || strcasecmp(ext, ".jpg")==0) )
		{
			lv_obj_clean(lv_scr_act());
            /* show image */
            lv_obj_t * img = lv_img_create(lv_scr_act());
			lv_img_set_src(img, full);
            lv_obj_center(img);
            lv_obj_add_event_cb(img, img_back_btn_cb, LV_EVENT_DELETE, NULL);
			
			/* back button to return to browser */
            lv_obj_t * back = lv_btn_create(lv_scr_act());
            lv_obj_set_size(back, 100, 50);
            lv_obj_align(back, LV_ALIGN_TOP_LEFT, 5, 5);
            lv_obj_t * lbl = lv_label_create(back);
            lv_label_set_text(lbl, "Back");
            lv_obj_center(lbl);
            lv_obj_add_event_cb(back, back_button_cb, LV_EVENT_CLICKED, NULL);
			
        } 
		else if(ext && (strcasecmp(ext, ".gif")==0))
		{
			printf("find a gif \n");
			lv_obj_clean(lv_scr_act());
			/* show gif */
            lv_obj_t * gif = lv_gif_create(lv_scr_act());
			lv_gif_set_src(gif, full);
            lv_obj_center(gif);
			lv_obj_add_event_cb(gif, img_back_btn_cb, LV_EVENT_DELETE, full);

			/* back button to return to browser */
            lv_obj_t * back = lv_btn_create(lv_scr_act());
            lv_obj_set_size(back, 100, 50);
            lv_obj_align(back, LV_ALIGN_TOP_LEFT, 5, 5);
            lv_obj_t * lbl = lv_label_create(back);
            lv_label_set_text(lbl, "Back");
            lv_obj_center(lbl);
            lv_obj_add_event_cb(back, back_button_cb, LV_EVENT_CLICKED, NULL);
			
		}
		else if(ext && strcasecmp(ext, ".txt")==0) 
		{
			printf("find a txt \n");
            /* show text - simple single read */
            FIL f;
            if(f_open(&f, full, FA_READ) == FR_OK) 
			{
				UINT br;	
//               char buf[1024];	//这样定义buf是占用栈空间的,及其容易导致栈溢出导致程序死机
//				f_read(&f, buf, sizeof(buf)-1, &br);
				
				char  *buf = lv_mem_alloc(1024); //这样定义buf是占用堆空间的
				if(!buf) 
				{
					printf("txt buf is null !!!\r\n");
					return ;
				}
				f_read(&f, buf, 1024, &br);
				
				
				printf("f_read %d bytes \r\n",br);
                buf[br] = '\0';
                f_close(&f);

                lv_obj_clean(lv_scr_act());
                lv_obj_t * ta = lv_textarea_create(lv_scr_act());
                lv_obj_set_size(ta, lv_pct(100), lv_pct(90));
				lv_obj_align(ta, LV_ALIGN_CENTER, 0, 0);
                lv_textarea_set_text(ta, buf);
				
                lv_obj_t * back = lv_btn_create(lv_scr_act());
                lv_obj_set_size(back, 80, 36);
                lv_obj_align(back, LV_ALIGN_TOP_LEFT, 5, 5);
                lv_obj_t * lbl = lv_label_create(back);
                lv_label_set_text(lbl, "Back");
                lv_obj_center(lbl);
                lv_obj_add_event_cb(back, back_button_cb, LV_EVENT_CLICKED, NULL);
            }
        } 
		else if(ext && strcasecmp(ext, ".nes")==0) 
		{
			printf("find a nesROM \n");
			if(xQueueSend(nesROM_Quene, full, pdMS_TO_TICKS(200)) != pdTRUE) 
			{
				printf("nesROM_Quene: queue send failed\n");
			}
        } 
		else 
		{
            printf("Unknown file type: %s\n", full);
        }
    }
}

问题根本原因:

// char buf1024; //这样定义buf是占用栈空间的,及其容易导致栈溢出导致程序死机
// f_read(&f, buf, sizeof(buf)-1, &br);

解决办法:

char *buf = lv_mem_alloc(1024); //这样定义buf是占用堆空间的
if(!buf)
{
printf("txt buf is null !!!\r\n");
return ;
}

使用lv_mem_alloc就可以解决!

相关推荐
happygrilclh16 小时前
STM32,串口单字节中断接受,每次上电后,会收到一个0x00的解决办法。
单片机·嵌入式硬件
智闲电子设计17 小时前
STM32 独立看门狗 IWDG 实战:系统跑飞,它来兜底复位
stm32·单片机·嵌入式硬件
嵌入式阿蔡20 小时前
HAL库 vs LL库 vs 寄存器:到底用哪个?
c语言·stm32·单片机·嵌入式硬件·嵌入式实时数据库
天空'之城21 小时前
单片机基础核心知识点汇总(三)
单片机·嵌入式硬件
嵌入式阿蔡21 小时前
CAN总线入门:从协议帧到STM32实战
c语言·stm32·单片机·嵌入式硬件·嵌入式实时数据库
离凌寒1 天前
一、对stm32mp157配置freertos后,任务挂掉无法启动问题总结
stm32·单片机·嵌入式硬件
消失的旧时光-19431 天前
7-fix补充篇:机器人为什么需要多级控制仲裁?Cloud、Linux 与 MCU 分别管什么
linux·单片机·机器人·仲裁机制·安全保护机制
Hello_Damon_Nikola1 天前
CH573从入门到精通
c语言·开发语言·单片机·嵌入式硬件
oshan20121 天前
华大小华HC32F460单片机在线烧录
单片机·嵌入式硬件
LCG元1 天前
STM32 USB HID 自定义免驱设备开发:从报告描述符到上位机 64 字节收发实战
stm32·单片机·嵌入式硬件