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