按下按钮时出现分段故障 你好, 我使用的是 imx9352 处理器,点击菜单页面上的一个环保按钮后,我正在加载生态屏幕,并在运行时创建文本区域以使用单板。 每当用户点击这个按钮时,就会出现 seg 故障,屏幕变成空白,原因何在? void screen_init(lv_obj_t *parent) { ta_best_load_ratio_val_1 = lv_textarea_create(guider_ui.ECO_page_container_eco_page_cont); lv_obj_set_pos(ta_best_load_ratio_val_1、 279, 134); lv_obj_set_size(ta_best_load_ratio_val_1、 104, 30); lv_obj_set_style_bg_color(ta_best_load_ratio_val_1、 lv_color_hex(0xE8E8E8), 0); lv_obj_set_style_text_font(ta_best_load_ratio_val_1、 &lv_font_NotoSans_Regular_18、 0); LV_OBJ_ADD_EVENT_CB(ta_best_load_ratio_val_1,ta_focus_cb,LV_EVENT_ALL、 NULL); LV_OBJ_ADD_EVENT_CB(ta_best_load_ratio_val_1, ta_done_cb, LV_EVENT_ALL、 NULL); LV_OBJ_ADD_EVENT_CB(ta_best_load_ratio_val_1, textarea_event_cb, LV_EVENT_ALL、 NULL); LV_OBJ_CLEAR_FLAG(ta_best_load_ratio_val_1, LV_OBJ_FLAG_SCROLLABLE); lv_textarea_set_cursor_pos(ta_best_load_ratio_val_1、 -1); lv_textarea_set_one_line(ta_best_load_ratio_val_1、 true); ta_eco_cycle_period_val_1 = lv_textarea_create(guider_ui.ECO_page_container_eco_page_cont); lv_obj_set_pos(ta_eco_cycle_period_val_1、 279, 180); lv_obj_set_size(ta_eco_cycle_period_val_1、 104, 30); lv_obj_set_style_bg_color(ta_eco_cycle_period_val_1、 lv_color_hex(0xD8D8D8), 0); lv_obj_set_style_text_font(ta_eco_cycle_period_val_1、 &lv_font_NotoSans_Regular_18、 0); LV_OBJ_ADD_EVENT_CB(ta_eco_cycle_period_val_1,ta_focus_cb,LV_EVENT_ALL、 NULL); LV_OBJ_ADD_EVENT_CB(ta_eco_cycle_period_val_1,ta_done_cb,LV_EVENT_ALL、 NULL); LV_OBJ_ADD_EVENT_CB(ta_eco_cycle_period_val_1,textarea_event_cb,LV_EVENT_ALL、 NULL); LV_OBJ_CLEAR_FLAG(ta_eco_cycle_period_val_1,LV_OBJ_FLAG_SCROLLABLE); lv_textarea_set_cursor_pos(ta_eco_cycle_period_val_1、 -1); lv_textarea_set_one_line(ta_eco_cycle_period_val_1、 真); ta_eco_min_module_noo_val_1 = lv_textarea_create(guider_ui.ECO_page_container_eco_page_cont); lv_obj_set_pos(ta_eco_min_module_noo_val_1、 693, 88); lv_obj_set_size(ta_eco_min_module_noo_val_1、 104, 30); lv_obj_set_style_bg_color(ta_eco_min_module_noo_val_1、 lv_color_hex(0xD8D8D8), 0); lv_obj_set_style_text_font(ta_eco_min_module_noo_val_1、 &lv_font_NotoSans_Regular_18、 0); LV_OBJ_ADD_EVENT_CB(ta_eco_min_module_no_val_1,ta_focus_cb,LV_EVENT_ALL、 NULL); LV_OBJ_ADD_EVENT_CB(ta_eco_min_module_no_val_1,ta_done_cb,LV_EVENT_ALL、 NULL); LV_OBJ_ADD_EVENT_CB(ta_eco_min_module_no_val_1,textarea_event_cb,LV_EVENT_ALL、 NULL); LV_OBJ_CLEAR_FLAG(ta_eco_min_module_no_val_1,LV_OBJ_FLAG_SCROLLABLE); lv_textarea_set_cursor_pos(ta_eco_min_module_noo_val_1、 -1); lv_textarea_set_one_line(ta_eco_min_module_noo_val_1、 true); ta_rect_save_stop_val_1 = lv_textarea_create(guider_ui.ECO_page_container_eco_page_cont); lv_obj_set_pos(ta_rect_save_stop_val_1、 693, 134); lv_obj_set_size(ta_rect_save_stop_val_1、 104, 30); lv_obj_set_style_bg_color(ta_rect_save_stop_val_1、 lv_color_hex(0xE8E8E8), 0); lv_obj_set_style_text_font(ta_rect_save_stop_val_1、 &lv_font_NotoSans_Regular_18、 0); LV_OBJ_ADD_EVENT_CB(ta_rect_save_stop_val_1,ta_focus_cb,LV_EVENT_ALL、 NULL); LV_OBJ_ADD_EVENT_CB(ta_rect_save_stop_val_1,ta_done_cb,LV_EVENT_ALL、 NULL); lv_obj_add_event_cb(ta_rect_save_stop_val_1,textarea_event_cb,LV_EVENT_ALL、 NULL); LV_OBJ_CLEAR_FLAG(ta_rect_save_stop_val_1, LV_OBJ_FLAG_SCROLLABLE); lv_textarea_set_cursor_pos(ta_rect_save_stop_val_1、 -1); lv_textarea_set_one_line(ta_rect_save_stop_val_1、 true); ta_dry_time_val_1 = lv_textarea_create(guider_ui.ECO_page_container_eco_page_cont); lv_obj_set_pos(ta_dry_time_val_1、 693, 180); lv_obj_set_size(ta_dry_time_val_1、 104, 30); lv_obj_set_style_bg_color(ta_dry_time_val_1、 lv_color_hex(0xD8D8D8), 0); lv_obj_set_style_text_font(ta_dry_time_val_1、 &lv_font_NotoSans_Regular_18、 0); LV_OBJ_ADD_EVENT_CB(ta_dry_time_val_1,ta_focus_cb,LV_EVENT_ALL、 NULL); LV_OBJ_ADD_EVENT_CB(ta_dry_time_val_1,ta_done_cb,LV_EVENT_ALL、 NULL); LV_OBJ_ADD_EVENT_CB(ta_dry_time_val_1,textarea_event_cb,LV_EVENT_ALL、 NULL); LV_OBJ_CLEAR_FLAG(ta_dry_time_val_1, LV_OBJ_FLAG_SCROLLABLE); lv_textarea_set_cursor_pos(ta_dry_time_val_1、 -1); lv_textarea_set_one_line(ta_dry_time_val_1、 true); ta_best_load_ratio_val_2 = lv_textarea_create(guider_ui.ECO_page_container_eco_page_cont); lv_obj_set_pos(ta_best_load_ratio_val_2、 279, 303); lv_obj_set_size(ta_best_load_ratio_val_2、 104, 30); lv_obj_set_style_bg_color(ta_best_load_ratio_val_2、 lv_color_hex(0xE8E8E8), 0); lv_obj_set_style_text_font(ta_best_load_ratio_val_2、 &lv_font_NotoSans_Regular_18、 0); LV_OBJ_ADD_EVENT_CB(ta_best_load_ratio_val_2,ta_focus_cb,LV_EVENT_ALL、 NULL); LV_OBJ_ADD_EVENT_CB(ta_best_load_ratio_val_2,ta_done_cb,LV_EVENT_ALL、 NULL); LV_OBJ_ADD_EVENT_CB(ta_best_load_ratio_val_2, textarea_event_cb, LV_EVENT_ALL、 NULL); LV_OBJ_CLEAR_FLAG(ta_best_load_ratio_val_2, LV_OBJ_FLAG_SCROLLABLE); lv_textarea_set_cursor_pos(ta_best_load_ratio_val_2、 -1); lv_textarea_set_one_line(ta_best_load_ratio_val_2、 true); ta_eco_cycle_period_val_2 = lv_textarea_create(guider_ui.ECO_page_container_eco_page_cont); lv_obj_set_pos(ta_eco_cycle_period_val_2、 279, 349); lv_obj_set_size(ta_eco_cycle_period_val_2、 104, 30); lv_obj_set_style_bg_color(ta_eco_cycle_period_val_2、 lv_color_hex(0xD8D8D8), 0); lv_obj_set_style_text_font(ta_eco_cycle_period_val_2、 &lv_font_NotoSans_Regular_18、 0); LV_OBJ_ADD_EVENT_CB(ta_eco_cycle_period_val_2,ta_focus_cb,LV_EVENT_ALL、 NULL); LV_OBJ_ADD_EVENT_CB(ta_eco_cycle_period_val_2,ta_done_cb,LV_EVENT_ALL、 NULL); LV_OBJ_ADD_EVENT_CB(ta_eco_cycle_period_val_2,textarea_event_cb,LV_EVENT_ALL、 NULL); LV_OBJ_CLEAR_FLAG(ta_eco_cycle_period_val_2,LV_OBJ_FLAG_SCROLLABLE); lv_textarea_set_cursor_pos(ta_eco_cycle_period_val_2、 -1); lv_textarea_set_one_line(ta_eco_cycle_period_val_2、 true); ta_eco_min_module_noo_val_2 = lv_textarea_create(guider_ui.ECO_page_container_eco_page_cont); lv_obj_set_pos(ta_eco_min_module_noo_val_2、 693, 257); lv_obj_set_size(ta_eco_min_module_noo_val_2、 104, 30); lv_obj_set_style_bg_color(ta_eco_min_module_noo_val_2、 lv_color_hex(0xD8D8D8), 0); lv_obj_set_style_text_font(ta_eco_min_module_noo_val_2、 &lv_font_NotoSans_Regular_18、 0); LV_OBJ_ADD_EVENT_CB(ta_eco_min_module_no_val_2,ta_focus_cb,LV_EVENT_ALL、 NULL); LV_OBJ_ADD_EVENT_CB(ta_eco_min_module_no_val_2,ta_done_cb,LV_EVENT_ALL、 NULL); LV_OBJ_ADD_EVENT_CB(ta_eco_min_module_no_val_2,textarea_event_cb,LV_EVENT_ALL、 NULL); LV_OBJ_CLEAR_FLAG(ta_eco_min_module_no_val_2,LV_OBJ_FLAG_SCROLLABLE); lv_textarea_set_one_line(ta_eco_min_module_noo_val_2、 true); lv_textarea_set_max_length(ta_eco_min_module_noo_val_2、 5); lv_textarea_set_cursor_pos(ta_eco_min_module_noo_val_2、 -1); ta_dcdc_save_stop_val_2 = lv_textarea_create(guider_ui.ECO_page_container_eco_page_cont); lv_obj_set_pos(ta_dcdc_save_stop_val_2、 693, 303); lv_obj_set_size(ta_dcdc_save_stop_val_2、 104, 30); lv_obj_set_style_bg_color(ta_dcdc_save_stop_val_2、 lv_color_hex(0xE8E8E8), 0); lv_obj_set_style_text_font(ta_dcdc_save_stop_val_2、 &lv_font_NotoSans_Regular_18、 0); LV_OBJ_ADD_EVENT_CB(ta_dcdc_save_stop_val_2,ta_focus_cb,LV_EVENT_ALL、 NULL); LV_OBJ_ADD_EVENT_CB(ta_dcdc_save_stop_val_2,ta_done_cb,LV_EVENT_ALL、 NULL); LV_OBJ_ADD_EVENT_CB(ta_dcdc_save_stop_val_2,textarea_event_cb,LV_EVENT_ALL、 NULL); lv_textarea_set_one_line(ta_dcdc_save_stop_val_2、 true); LV_OBJ_CLEAR_FLAG(ta_dcdc_save_stop_val_2, LV_OBJ_FLAG_SCROLLABLE); lv_textarea_set_cursor_pos(ta_dcdc_save_stop_val_2、 -1); ta_dry_time_val_2 = lv_textarea_create(guider_ui.ECO_page_container_eco_page_cont); lv_obj_set_pos(ta_dry_time_val_2、 693, 349); lv_obj_set_size(ta_dry_time_val_2、 104, 30); lv_obj_set_style_bg_color(ta_dry_time_val_2、 lv_color_hex(0xD8D8D8), 0); lv_obj_set_style_text_font(ta_dry_time_val_2、 &lv_font_NotoSans_Regular_18、 0); LV_OBJ_ADD_EVENT_CB(ta_dry_time_val_2,ta_focus_cb,LV_EVENT_ALL、 NULL); LV_OBJ_ADD_EVENT_CB(ta_dry_time_val_2,ta_done_cb,LV_EVENT_ALL、 NULL); LV_OBJ_ADD_EVENT_CB(ta_dry_time_val_2,textarea_event_cb,LV_EVENT_ALL、 NULL); lv_textarea_set_one_line(ta_dry_time_val_2、 true); LV_OBJ_CLEAR_FLAG(ta_dry_time_val_2, LV_OBJ_FLAG_SCROLLABLE); lv_textarea_set_cursor_pos(ta_dry_time_val_2、 -1); ta_ipv4_addr = lv_textarea_create(guider_ui.network_setting_page_network_setting_cont); lv_obj_set_pos(ta_ipv4_addr、 234, 105); // 调整位置 lv_obj_set_size(ta_ipv4_addr、 200, 30); // 调整大小 lv_obj_set_style_bg_color(ta_ipv4_addr、 lv_color_hex(0xE8E8E8), 0); lv_obj_set_style_text_font(ta_ipv4_addr、 &lv_font_NotoSans_Regular_18、 0); lv_textarea_set_placeholder_text(ta_ipv4_addr、 "IPv4 地址"); LV_OBJ_ADD_EVENT_CB(ta_ipv4_addr,ta_focus_cb,LV_EVENT_ALL、 NULL); LV_OBJ_ADD_EVENT_CB(ta_ipv4_addr,ta_done_cb,LV_EVENT_ALL、 NULL); LV_OBJ_ADD_EVENT_CB(ta_ipv4_addr,textarea_event_cb,LV_EVENT_ALL、 NULL); LV_OBJ_CLEAR_FLAG(ta_ipv4_addr,LV_OBJ_FLAG_SCROLLABLE); lv_textarea_set_cursor_pos(ta_ipv4_addr、 -1); lv_textarea_set_one_line(ta_ipv4_addr、 true); // IPv4 子网掩码 ta_ipv4_mask = lv_textarea_create(guider_ui.network_setting_page_network_setting_cont); lv_obj_set_pos(ta_ipv4_mask、 234, 152); lv_obj_set_size(ta_ipv4_mask、 200, 30); lv_obj_set_style_bg_color(ta_ipv4_mask、 lv_color_hex(0xD8D8D8), 0); lv_obj_set_style_text_font(ta_ipv4_mask、 &lv_font_NotoSans_Regular_18、 0); lv_textarea_set_placeholder_text(ta_ipv4_mask、 "子网掩码"); LV_OBJ_ADD_EVENT_CB(ta_ipv4_mask,ta_focus_cb,LV_EVENT_ALL、 NULL); LV_OBJ_ADD_EVENT_CB(ta_ipv4_mask,ta_done_cb,LV_EVENT_ALL、 NULL); lv_obj_add_event_cb(ta_ipv4_mask,textarea_event_cb,LV_EVENT_ALL、 NULL); LV_OBJ_CLEAR_FLAG(ta_ipv4_mask, LV_OBJ_FLAG_SCROLLABLE); lv_textarea_set_cursor_pos(ta_ipv4_mask、 -1); lv_textarea_set_one_line(ta_ipv4_mask、 真); //IPv4 网关 ta_ipv4_gw = lv_textarea_create(guider_ui.network_setting_page_network_setting_cont); lv_obj_set_pos(ta_ipv4_gw、 234, 199); lv_obj_set_size(ta_ipv4_gw、 200, 30); lv_obj_set_style_bg_color(ta_ipv4_gw、 lv_color_hex(0xE8E8E8), 0); lv_obj_set_style_text_font(ta_ipv4_gw.Lv_font_NotoSans_Regular_18)、 &lv_font_NotoSans_Regular_18、 0); lv_textarea_set_placeholder_text (ta_ipv4_gw ," Gateway "); LV_OBJ_ADD_EVENT_CB(ta_ipv4_gw,ta_focus_cb,LV_EVENT_ALL、 NULL); LV_OBJ_ADD_EVENT_CB(ta_ipv4_gw,ta_done_cb,LV_EVENT_ALL、 NULL); lv_obj_add_event_cb(ta_ipv4_gw,textarea_event_cb,LV_EVENT_ALL、 NULL); LV_OBJ_CLEAR_FLAG(ta_ipv4_gw,LV_OBJ_FLAG_SCROLLABLE); lv_textarea_set_cursor_pos(ta_ipv4_gw、 -1); lv_textarea_set_one_line(ta_ipv4_gw、 true); /* 1) 创建一个键盘 */ kb = 创建(父); lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN); lv_obj_set_size(千字节 LV_PCT(100), LV_PCT(40)); // lv_keyboard_set_mode(kb, LV_KEYBOARD_MODE_TEXT_LOWER); lv_obj_align(kb,LV_ALIGN_BOTTOM_MID、 0, 0); // lv_keyboard_set_cursor_manage(kb, true); }} 我在事件处理程序中调用的是 静态 void menu_page_eco_btn_event_handler(事件处理 *e) { lv_event_code_t 代码 = lv_event_get_code(e); 开关(代码) { 案例lv_event_clicked: { ui_load_scr_animation(&引导器, &guider_ui.ECO_page_container, 引导者.ECO_page_container_del, &引导者.menu_page_del, setup_scr_ECO_page_container, lv_scr_load_anim_fade_on、 200, 200, true, 假); 创建警报条(guider_ui.ECO_page_container_eco_page_cont); // 确保在加载 "概览 "页面时可见 LV_OBJ_CLEAR_FLAG(alarm_bar,LV_OBJ_FLAG_HIDDEN); screen_init(guider_ui.ECO_page_container); 打破; } 默认值: 打破; } }} ,我将当前屏幕的可用内存也包括在内,因此在后端,当包括后端在内的线程正在运行时,客户端将尝试更新上述创建文本区域的值,此时只会出现 seg 故障,但在点击 eco btn 时,如果只点击前端而没有任何通过创建文本区域来访问文本区域的后端,则不会出现 seg 故障。 在点击事件处理程序中访问上述 init 函数创建的文本区域时,有什么具体方法吗? 此外,用于更新文本区域的 LcdHandler_Init(); 函数也在以下位置被调用 int main(void) { /* 初始化 LVGL */ lv_init(); /* 为 LVGL 初始化 HAL(显示器、输入设备)*/ hal_init(); /* 创建 GUI-Guider 应用程序 */ setup_ui(&guider_ui); events_init(&guider_ui); 自定义(&guider_ui); // 初始化 LCD 处理程序和 DBus 连接 LcdHandler_Init(); #ifLV_USE_VIDEO pthread_create(&视频线程 NULL, videoPlayThread、 NULL); #endif /* 处理 LVGL 任务 */ #ifLV_USE_WAYLAND bool完成; 虽然(1) { 完成 = lv_wayland_timer_handler(); 如果(完成){ /* 仅在循环完成时等待 */ usleep(lv_def_refr_period * 1000); } /* 运行直至最后一个窗口关闭 */ 如果(!lv_wayland_window_is_open(NULL)){ 打破; } } #else uint32_t 空闲时间; 虽然(1) { /* 返回下一次执行定时器的时间 */ 空闲时间 = lv_timer_handler(); usleep(空闲时间 * 1000); } #endif 返回 0; } 另外,我们分配的内存大小为 1535998 kb 请查看正在添加自定义文件的元层, 请尽快联系我们,快速回复。 这是非常关键的团队、 Re: segmentation fault on pressing button 是的,我们尝试了使用 lv_async_call() ,它确实清除了 seg 故障。 感谢团队 Re: segmentation fault on pressing button 你好@sana
希望你一切都好。
所有 LVGL 对象的创建、删除或修改都必须在运行lv_timer_handler() 的同一线程中进行,而在你的代码中,你产生了一个后端线程(LcdHandler_Init),该线程试图直接更新ta_*对象。
这意味着 LVGL 对象正被两个线程所触及:
1.UI 循环(运行lv_timer_handler() 的主线程)
2.您的后端线程
当您按下 ECO 按钮时会崩溃,因为这是您动态创建新文本区的地方。
后台线程可能拥有指向其中一个线程的指针,并在 LVGL 仍在铺设或释放旧指针时更新它。lv_obj_t * 后面的内存已失效。
您可以尝试使用lv_async_call()。
如果您能分享您的 Gui Guider 项目和 Gui Guider 版本,将对我们非常有帮助。
顺祝商祺!
萨拉斯
View full article