diff --git a/Drivers/BSP/UI/ui_menu.c b/Drivers/BSP/UI/ui_menu.c index c3162012..5897ddea 100644 --- a/Drivers/BSP/UI/ui_menu.c +++ b/Drivers/BSP/UI/ui_menu.c @@ -11,6 +11,9 @@ #include "lvgl.h" +#define DBG_TAG "[UI_MENU]" +#include "dbg_log.h" + /* 菜单节点表(简化自 DTU-HMI menuTab):层级 + 名称 */ typedef struct { uint8_t level; /* 0=根页面, 1..3=子层次 */ @@ -87,9 +90,9 @@ static const ui_menu_node_t g_menu_tab[] = { * 入口参数:无 * 返回值:0 - 成功,其他 - 失败(对象创建失败) * 限定条件:ui_port_init() 已成功调用,活动屏幕存在 - * 函数说明:1. 依据紧凑节点表按层级生成 lv_menu 页面与返回栈 - * 2. 将菜单对象加入默认输入组,支持远端按键导航 - * 3. 叶子节点挂占位页,等待后续逐项填充具体功能 + * 函数说明:1. 仅构建主页面(根页 + 一级菜单项),子树暂不构建以控制内存占用 + * 2. 文本全部使用静态字符串(不 strdup),减少 LVGL 堆分配 + * 3. 构建中监控 LVGL 池空闲内存,不足时中止而非崩溃 */ int ui_menu_init(void) { @@ -101,44 +104,46 @@ int ui_menu_init(void) lv_menu_set_mode_root_back_button(menu, LV_MENU_ROOT_BACK_BUTTON_ENABLED); lv_group_add_obj(lv_group_get_default(), menu); + /* 仅构建主页面:根页 + 一级菜单项(静态文本,不建子树,省内存) */ + lv_obj_t *root_page = lv_menu_page_create(menu, NULL); + if (root_page == NULL) { + return -1; + } + lv_menu_set_page_title_static(root_page, "主界面"); + + lv_mem_monitor_t mon; + lv_mem_monitor(&mon); + DBG_INFO("menu build start: total=%u free=%u big=%u", + (unsigned)mon.total_size, + (unsigned)mon.free_size, (unsigned)mon.free_biggest_size); + uint32_t n = sizeof(g_menu_tab) / sizeof(g_menu_tab[0]); - lv_obj_t *root_page = NULL; - lv_obj_t *parent_stack[4] = {NULL, NULL, NULL, NULL}; + for (uint32_t i = 1; i < n; i++) { + if (g_menu_tab[i].level != 1) { + continue; /* 只显示一级菜单项,子树暂不构建 */ + } + + /* 内存警戒:空闲池不足则中止,避免 LVGL 内部 NULL 解引用崩溃 */ + lv_mem_monitor(&mon); + if (mon.free_biggest_size < 1024) { + DBG_ERROR("menu mem low: abort at item %u (free=%u big=%u)", + (unsigned)i, (unsigned)mon.free_size, + (unsigned)mon.free_biggest_size); + break; + } - for (uint32_t i = 0; i < n; i++) { - uint8_t L = g_menu_tab[i].level; const char *name = g_menu_tab[i].name; - - if (i == 0) { - /* 第 0 节点为根(主界面) */ - root_page = lv_menu_page_create(menu, name); - parent_stack[0] = root_page; - continue; - } - - /* 当前节点页面 */ - lv_obj_t *page = lv_menu_page_create(menu, name); - - /* 叶子:页内挂占位内容 */ - int leaf = (i + 1 >= n) || (g_menu_tab[i + 1].level <= L); - if (leaf) { - lv_obj_t *ph = lv_menu_cont_create(page); - lv_obj_t *pl = lv_label_create(ph); - lv_label_set_text(pl, "功能未实现(占位)"); - } - - /* 挂到父页:level0 直挂根,其余挂到上一级页面 */ - lv_obj_t *parent = (L == 0) ? root_page : parent_stack[L - 1]; - - /* 在父页创建一个容器项,点击加载当前页 */ - lv_obj_t *item = lv_menu_cont_create(parent); + lv_obj_t *item = lv_menu_cont_create(root_page); lv_obj_t *lbl = lv_label_create(item); - lv_label_set_text(lbl, name); - lv_menu_set_load_page_event(menu, item, page); - - parent_stack[L] = page; + lv_label_set_text_static(lbl, name); } lv_menu_set_page(menu, root_page); + + lv_mem_monitor(&mon); + DBG_INFO("menu build done: total=%u free=%u big=%u used=%u", + (unsigned)mon.total_size, + (unsigned)mon.free_size, (unsigned)mon.free_biggest_size, + (unsigned)(mon.total_size - mon.free_size)); return 0; } diff --git a/MDK-ARM/STM32F407-Demo/STM32F407-Demo.sct b/MDK-ARM/STM32F407-Demo/STM32F407-Demo.sct index 8d1bd88b..34f119a4 100644 --- a/MDK-ARM/STM32F407-Demo/STM32F407-Demo.sct +++ b/MDK-ARM/STM32F407-Demo/STM32F407-Demo.sct @@ -1,7 +1,7 @@ ; ************************************************************* ; *** Scatter-Loading Description File (manual) *** -; *** RW_IRAM3(SRAM3) for ucHeap big block. DO NOT let uVision *** -; *** regenerate this file (keep "Use Memory Layout" unchecked)*** +; *** IRAM1 = SRAM1+SRAM2 128KB continuous RAM. *** +; *** No SRAM3 usage (may not exist on clone MCUs). *** ; ************************************************************* LR_IROM1 0x08000000 0x00100000 { ; load region size_region @@ -11,11 +11,7 @@ LR_IROM1 0x08000000 0x00100000 { ; load region size_region .ANY (+RO) .ANY (+XO) } - RW_IRAM1 0x20000000 0x00020000 { ; RW data - .ANY (+RW +ZI) - } - RW_IRAM3 0x20040000 0x00010000 { ; SRAM3 for ucHeap - heap_4.o (+RW +ZI) + RW_IRAM1 0x20000000 0x00020000 { ; SRAM1+SRAM2, 128KB .ANY (+RW +ZI) } } diff --git a/MDK-ARM/build.bat b/MDK-ARM/build.bat index 90b93617..98d86c7d 100644 --- a/MDK-ARM/build.bat +++ b/MDK-ARM/build.bat @@ -6,7 +6,7 @@ set PROJ=%~dp0STM32F407-Demo.uvprojx set LOG=%~dp0build_log.txt set TARGET=STM32F407-Demo -"%UV4%" -r "%PROJ%" -t%TARGET% -j0 -o "%LOG%" +"%UV4%" -b "%PROJ%" -t%TARGET% -j0 -o "%LOG%" findstr /C:"0 Error(s), 0 Warning(s)" "%LOG%" >nul if %ERRORLEVEL% equ 0 ( diff --git a/MDK-ARM/build_log.txt b/MDK-ARM/build_log.txt index 67facdaf..007d177f 100644 --- a/MDK-ARM/build_log.txt +++ b/MDK-ARM/build_log.txt @@ -1,279 +1,8 @@ *** Using Compiler 'V5.06 update 7 (build 960)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin' -Rebuild target 'STM32F407-Demo' -assembling startup_stm32f407xx.s... -compiling dma.c... -compiling i2c.c... -compiling stm32f4xx_hal_timebase_tim.c... -compiling stm32f4xx_hal_dma_ex.c... -compiling gpio.c... -compiling stm32f4xx_hal_msp.c... -compiling stm32f4xx_it.c... -compiling stm32f4xx_hal_dma.c... -compiling spi.c... -compiling sys_clock.c... -compiling stm32f4xx_hal_flash_ex.c... -compiling stm32f4xx_hal_flash.c... -compiling stm32f4xx_hal_pwr.c... -compiling stm32f4xx_hal_pwr_ex.c... -compiling stm32f4xx_hal_rcc_ex.c... -compiling stm32f4xx_hal_flash_ramfunc.c... -compiling stm32f4xx_hal_gpio.c... -compiling freertos.c... -compiling usart.c... -compiling app_main.c... -compiling main.c... -compiling stm32f4xx_hal_rcc.c... -compiling time_sync.c... -compiling ui_task.c... -compiling net_task.c... -compiling stm32f4xx_hal_tim_ex.c... -compiling lftpd_string.c... -compiling croutine.c... -compiling event_groups.c... -compiling list.c... -compiling stm32f4xx_hal_tim.c... -compiling queue.c... -compiling stream_buffer.c... -compiling timers.c... -compiling heap_4.c... -compiling stm32f4xx_hal_cortex.c... -compiling tasks.c... -compiling port.c... -compiling map.c... -compiling journal.c... -compiling ff.c... -compiling stm32f4xx_hal.c... -compiling system_stm32f4xx.c... -compiling test_config.c... -compiling ch395f_test_task.c... -compiling stm32f4xx_hal_i2c_ex.c... -compiling net_test_task.c... -compiling gd5f_test_task.c... -compiling cmsis_os2.c... -compiling sd2506.c... -compiling rs485.c... -compiling stm32f4xx_hal_exti.c... -compiling nand_ftl.c... -compiling tpafe5160.c... -compiling lftpd_io.c... -compiling ch395f.c... -compiling lv_obj_class.c... -compiling lftpd_inet.c... -compiling lv_obj_event.c... -compiling lv_group.c... -compiling lv_obj_draw.c... -compiling net_select.c... -compiling stm32f4xx_hal_spi.c... -compiling lv_obj.c... -compiling gd5f2gq5ue.c... -compiling stm32f4xx_hal_uart.c... -compiling lv_obj_property.c... -compiling net_socket.c... -compiling lv_obj_id_builtin.c... -compiling lftpd.c... -compiling lv_draw_3d.c... -compiling lv_obj_tree.c... -compiling lv_obj_style_gen.c... -compiling stm32f4xx_hal_i2c.c... -compiling lv_obj_scroll.c... -compiling lv_draw.c... -compiling lv_draw_arc.c... -compiling lv_obj_style.c... -compiling lv_obj_pos.c... -compiling lv_refr.c... -compiling lv_draw_line.c... -compiling lv_draw_mask.c... -compiling lv_display.c... -compiling lv_draw_image.c... -compiling lv_draw_buf.c... -compiling lv_draw_vector.c... -compiling lv_draw_rect.c... -compiling lv_draw_triangle.c... -compiling lv_draw_label.c... -compiling lv_draw_sw_blend.c... -compiling lv_image_decoder.c... -compiling lv_draw_sw_blend_to_al88.c... -compiling lv_draw_sw_blend_to_argb8888_premultiplied.c... -compiling lv_draw_sw_blend_to_argb8888.c... -compiling lv_draw_sw_grad.c... -compiling lv_draw_sw_arc.c... -compiling lv_draw_sw.c... -compiling lv_draw_sw_fill.c... -compiling lv_draw_sw_border.c... -compiling lv_draw_sw_letter.c... -compiling lv_draw_sw_mask_rect.c... -compiling lv_draw_sw_blend_to_l8.c... -compiling lv_draw_sw_blend_to_i1.c... -compiling lv_draw_sw_utils.c... -compiling lv_draw_sw_triangle.c... -compiling lv_draw_sw_line.c... -compiling lv_draw_sw_vector.c... -compiling lv_draw_sw_blend_to_rgb888.c... -compiling lv_draw_sw_img.c... -compiling lv_draw_sw_box_shadow.c... -compiling lv_font.c... -compiling lv_draw_sw_mask.c... -compiling lv_draw_sw_transform.c... -compiling lv_draw_sw_blend_to_rgb565.c... -compiling lv_draw_sw_blend_to_rgb565_swapped.c... -compiling storage_test_task.c... -compiling lv_binfont_loader.c... -compiling sd2506_test_task.c... -compiling lv_font_dejavu_16_persian_hebrew.c... -compiling lv_font_fmt_txt.c... -compiling lv_font_montserrat_10.c... -compiling lv_font_montserrat_12.c... -compiling lv_font_montserrat_14.c... -compiling lv_font_montserrat_14_aligned.c... -compiling lv_font_montserrat_16.c... -compiling lv_font_montserrat_18.c... -compiling lv_font_montserrat_22.c... -compiling lv_font_montserrat_20.c... -compiling lv_font_montserrat_24.c... -compiling lv_font_montserrat_26.c... -compiling lv_font_montserrat_28.c... -compiling lv_font_montserrat_28_compressed.c... -compiling lv_font_montserrat_30.c... -compiling lv_font_montserrat_32.c... -compiling lv_font_montserrat_34.c... -compiling lv_font_montserrat_36.c... -compiling lv_font_montserrat_38.c... -compiling lv_font_montserrat_40.c... -compiling lv_font_montserrat_44.c... -compiling lv_font_montserrat_42.c... -compiling lv_font_montserrat_46.c... -compiling lv_font_montserrat_48.c... -compiling lv_font_montserrat_8.c... -compiling lv_font_simsun_14_cjk.c... -compiling lv_font_simsun_16_cjk.c... -compiling lv_font_source_han_sans_sc_14_cjk.c... -compiling lv_indev_gesture.c... -compiling lv_font_unscii_16.c... -compiling lv_font_source_han_sans_sc_16_cjk.c... -compiling lv_font_unscii_8.c... -compiling lv_cache_lru_ll.c... -compiling lv_cache_lru_rb.c... -compiling lv_cache.c... -compiling lv_layout.c... -compiling lv_init.c... -compiling lv_indev_scroll.c... -compiling lv_image_cache.c... -compiling lv_image_header_cache.c... -compiling lv_cache_entry.c... -compiling lv_bin_decoder.c... -compiling lv_grid.c... -compiling lv_anim_timeline.c... -compiling lv_flex.c... -compiling lv_indev.c... -compiling lv_async.c... -compiling lv_bidi.c... -compiling lv_array.c... -compiling lv_anim.c... -compiling lv_circle_buf.c... -compiling lv_color_op.c... -compiling lv_area.c... -compiling lv_color.c... -compiling lv_grad.c... -compiling lv_iter.c... -compiling lv_log.c... -compiling lv_ll.c... -compiling lv_event.c... -compiling lv_lru.c... -compiling lv_matrix.c... -compiling lv_fs.c... -compiling lv_math.c... -compiling lv_templ.c... -compiling lv_rb.c... -compiling lv_palette.c... -compiling lv_style_gen.c... -compiling lv_text_ap.c... -compiling lv_profiler_builtin.c... -compiling lv_style.c... -compiling lv_cmsis_rtos2.c... -compiling lv_tree.c... -compiling lv_text.c... -compiling lv_utils.c... -compiling lv_freertos.c... -compiling lv_linux.c... -compiling lv_timer.c... -compiling lv_mqx.c... -compiling lv_os_none.c... -compiling lv_pthread.c... -compiling lv_sdl2.c... -compiling lv_windows.c... -compiling lv_rtthread.c... -compiling lv_os.c... -compiling lv_mem_core_builtin.c... -compiling lv_string_builtin.c... -compiling lv_sprintf_builtin.c... -compiling lv_sprintf_clib.c... -compiling lv_mem_core_clib.c... -compiling lv_string_clib.c... -compiling lv_tlsf.c... -compiling lv_mem_core_micropython.c... -compiling lv_mem_core_rtthread.c... -compiling lv_sprintf_rtthread.c... -compiling lv_string_rtthread.c... -compiling lv_mem_core_uefi.c... -compiling lv_mem.c... -compiling lv_3dtexture.c... -compiling lv_animimage.c... -compiling lv_tick.c... -compiling lv_theme_default.c... -compiling lv_arc.c... -compiling lv_theme.c... -compiling lv_theme_simple.c... -compiling lv_theme_mono.c... -compiling lv_button.c... -compiling lv_bar.c... -compiling lv_calendar_chinese.c... -compiling lv_calendar_header_arrow.c... -compiling lv_calendar_header_dropdown.c... -compiling lv_canvas.c... -compiling lv_chart.c... -compiling lv_buttonmatrix.c... -compiling lv_checkbox.c... -compiling lv_dropdown.c... -compiling lv_calendar.c... -compiling lv_keyboard.c... -compiling lv_imagebutton.c... -compiling lv_led.c... -compiling lv_image.c... -compiling lv_line.c... -compiling lv_lottie.c... -compiling lv_list.c... -compiling lv_objx_templ.c... -compiling lv_label.c... -compiling lv_dropdown_properties.c... -compiling lv_msgbox.c... -compiling lv_animimage_properties.c... -compiling lv_menu.c... -compiling lv_image_properties.c... -compiling lv_keyboard_properties.c... -compiling lv_label_properties.c... -compiling lv_obj_properties.c... -compiling lv_style_properties.c... -compiling lv_roller_properties.c... -compiling lv_slider_properties.c... -compiling lv_textarea_properties.c... -compiling lv_roller.c... -compiling lv_scale.c... -compiling lv_slider.c... -compiling lv_span.c... -compiling lv_spinbox.c... -compiling lv_switch.c... -compiling lv_table.c... -compiling ui_net_sink.c... -compiling lv_spinner.c... -compiling lv_tileview.c... -compiling lv_tabview.c... -compiling lv_win.c... +Build target 'STM32F407-Demo' compiling ui_menu.c... -compiling ui_port.c... -compiling ui_font_cn_12.c... -compiling lv_textarea.c... linking... -Program Size: Code=213444 RO-data=9684 RW-data=440 ZI-data=124640 +Program Size: Code=213580 RO-data=9792 RW-data=440 ZI-data=124640 FromELF: creating hex file... ".\STM32F407-Demo\STM32F407-Demo.axf" - 0 Error(s), 0 Warning(s). -Build Time Elapsed: 00:00:26 +Build Time Elapsed: 00:00:07 diff --git a/STM32F407-Demo.ioc b/STM32F407-Demo.ioc index a36c7bb6..7606de09 100644 --- a/STM32F407-Demo.ioc +++ b/STM32F407-Demo.ioc @@ -70,10 +70,10 @@ Dma.USART1_TX.0.PeriphInc=DMA_PINC_DISABLE Dma.USART1_TX.0.Priority=DMA_PRIORITY_LOW Dma.USART1_TX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode FREERTOS.Events01=sys_evt,Dynamic,NULL -FREERTOS.FootprintOK=false +FREERTOS.FootprintOK=true FREERTOS.IPParameters=Tasks01,configENABLE_FPU,FootprintOK,configTOTAL_HEAP_SIZE,Queues01,Events01 FREERTOS.Queues01=netMsgQueue,8,net_msg_t,0,Dynamic,NULL,NULL -FREERTOS.Tasks01=defaultTask,24,512,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL;netTask,24,1024,StartNetTask,Default,NULL,Dynamic,NULL,NULL;ftpTask,24,1024,StartFtpTask,As weak,NULL,Dynamic,NULL,NULL;testTask,16,4096,start_test_task,As weak,NULL,Dynamic,NULL,NULL;uiTask,16,4096,StartUiTask,Default,NULL,Dynamic,NULL,NULL +FREERTOS.Tasks01=defaultTask,24,512,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL;netTask,24,1024,StartNetTask,Default,NULL,Dynamic,NULL,NULL;ftpTask,24,1024,StartFtpTask,As weak,NULL,Dynamic,NULL,NULL;testTask,16,1024,start_test_task,As weak,NULL,Dynamic,NULL,NULL;uiTask,16,4096,StartUiTask,Default,NULL,Dynamic,NULL,NULL FREERTOS.configENABLE_FPU=1 FREERTOS.configTOTAL_HEAP_SIZE=49152 File.Version=6 diff --git a/Src/freertos.c b/Src/freertos.c index 3bf4bea8..4e60452a 100644 --- a/Src/freertos.c +++ b/Src/freertos.c @@ -89,7 +89,7 @@ const osThreadAttr_t ftpTask_attributes = { osThreadId_t testTaskHandle; const osThreadAttr_t testTask_attributes = { .name = "testTask", - .stack_size = 4096 * 4, + .stack_size = 1024 * 4, .priority = (osPriority_t) osPriorityBelowNormal, }; /* Definitions for uiTask */ @@ -231,7 +231,10 @@ void StartDefaultTask(void *argument) } for (;;) { - osDelay(1000); + HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); + HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); + HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin); + osDelay(500); } /* USER CODE END StartDefaultTask */ }