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

相关推荐
振南的单片机世界1 天前
PWM调压调速,H桥换向:直流电机四象限控制
arm开发·stm32·单片机·嵌入式硬件
深圳市晶科鑫实业有限公司1 天前
国产TCXO温补晶振是否可以完美替代欧美日系主流型号
人工智能·stm32·单片机·物联网·51单片机·信息与通信
iCxhust1 天前
C# 生成命令行程序 将hex格式烧录程序转换成bin烧录格式
开发语言·汇编·单片机·嵌入式硬件·c#·微机原理
不脱发的程序猿1 天前
DLL文件缺失怎么办?
单片机·嵌入式硬件·嵌入式
weixin_446260851 天前
TinyML 在 STM32 与 ESP32 上的完整部署指南:从模型训练、量化到推理优化
stm32·单片机·嵌入式硬件
资深流水灯工程师1 天前
基于 STM32L476 + SAI1 Block A + DMA 循环乒乓缓冲 实现 4 路加速度计 TDM 采集
stm32·单片机·嵌入式硬件
深圳市晶科鑫实业有限公司1 天前
AI服务器为何对低抖动差分晶振如此挑剔?
服务器·人工智能·单片机·物联网·车载系统·云计算·信息与通信
破晓单片机1 天前
063、STM32项目分享:智能儿童防丢书包系统
stm32·单片机·嵌入式硬件
fffzd1 天前
STM32:定时器--旋钮->旋转编码器!
stm32·单片机·嵌入式硬件·定时器·旋钮·旋转编码器