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就可以解决!

相关推荐
艾芯微科技3 小时前
SKY13370‑374LF|0.5‑6GHz SPDT 射频开关,WLAN/LTE 射频前端实用器件
网络·单片机·嵌入式硬件·集成测试·51单片机
jianqiang.xue4 小时前
收官:从v0.1到“研发新常态“,一套嵌入式智能体的落地与边界
stm32·单片机·物联网·架构·esp32
天空'之城5 小时前
单片机基础核心知识点汇总(三十)
单片机·嵌入式硬件
笨笨饿5 小时前
#137_死机恢复现场_Armino平台AP系统swd调试
git·python·stm32·单片机·嵌入式硬件·物联网·vim
linnux领域5 小时前
面包板供电“插哪都不亮“?一个暗断点引发的排查——硬件新手三板斧
单片机·嵌入式硬件·esp32·arduino·面包板·硬件入门
学linux的QQ蛋7 小时前
吃透传输层:UDP 无连接、TCP 可靠传输、套接字函数、粘包问题详解
单片机·tcp/ip·udp
单片机仿真设计9 小时前
基于 51 单片机老旧电梯层门防夹人装置优化设计(Proteus 仿真)
单片机·嵌入式硬件·proteus
wuyk55511 小时前
104.C 语言字节对齐:从底层原理到工程实践的完整指南
c语言·开发语言·stm32·单片机·嵌入式硬件
新晨单片机设计18 小时前
S006A-基于STM32单片机温湿度检测系统【Proteus仿真+Keil程序+原理图】
stm32·单片机·proteus
逐步前行20 小时前
ESP32-S3-分区表(Partition Table)
单片机