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 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 ;
}

使用lv_mem_alloc就可以解决!

相关推荐
czhaii7 小时前
并口LCD1602用DMA刷屏
单片机·嵌入式硬件·硬件工程
离凌寒7 小时前
二、在freertos中对应esp01s模块的ap模式下的通信测试。
单片机·freertos·esp01s
CFZPL7 小时前
esp32,stm32编译的不同
单片机·esp32
硅农深芯7 小时前
MCU的启动流程你了解么?
单片机·嵌入式硬件·硬件工程
xiaohai@Linux8 小时前
ESP32 IDF v5.3.1 驱动 CST816T 触摸芯片(I2C 协议)
单片机·嵌入式硬件·触摸·i2c·cst816t
zd8451015008 小时前
16bit ADC+DAC模拟量控制板第二方案设计
单片机·嵌入式硬件
星一工作室9 小时前
STM32项目分享:基于stm32的自动升降棋系统
stm32·单片机·嵌入式硬件
up向上up9 小时前
基于STM32温湿度采集Proteus仿真设计
stm32·单片机·proteus
搞全栈小苏10 小时前
LVGL与Qt深度对比分析:轻量与全能的技术博弈
qt·lvgl