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

相关推荐
不悔哥5 天前
开源OV-Watch:怎么做一个智能手表
单片机·开源·嵌入式
XiHongShi20165 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
深圳老胡5 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
女神下凡5 天前
嵌入式设计的各种存储芯片的硬件/软件设计规范,非常全面。
arm开发·单片机·嵌入式硬件
梅梅9666 天前
一款mipi转lvds的lcd调试(LT8912B)
单片机·计算机外设·电脑·显示器·pd芯片
开发笔记-阿牛6 天前
蓝牙音乐灯拆解,又一次拆到蓝牙音乐灯芯片CK6865L
人工智能·单片机·嵌入式硬件·音视频·音频
CHENKONG_CK6 天前
破解制鞋打磨痛点:RFID赋能去毛刺工序自动化升级
网络·单片机·嵌入式硬件·网络协议·tcp/ip
三佛科技-187366133976 天前
128KB~512KB Flash车规级MCU选型指南(FT32A072 / FT32A103 系列)
单片机·嵌入式硬件
Brilliantwxx6 天前
【STM32】 SPI Flash 驱动开发实战:阻塞模式驱动 W25Q64(含工程代码)
开发语言·stm32·单片机·嵌入式硬件
纳祥科技6 天前
拆机拆到芯片级:ARC功放机里的NX7026、NX8420、NX6805
单片机·音视频·智能音箱