From a413ae0d193b0707e5cc7c1334ff09a572a9f721 Mon Sep 17 00:00:00 2001 From: BMourit Date: Mon, 19 May 2025 22:27:10 -0700 Subject: [PATCH 1/3] Fix dangling pointer build warning --- Marlin/src/lcd/menu/menu_motion.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index e2adbfded212..e29f5f1b8c68 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -403,13 +403,13 @@ void menu_move() { void menu_ft_motion() { // Define stuff ahead of the menu loop - MString<20> shaper_name[NUM_AXES_SHAPED] {}; + static MString<20> shaper_name[NUM_AXES_SHAPED] {}; #if HAS_X_AXIS for (uint_fast8_t a = X_AXIS; a < NUM_AXES_SHAPED; ++a) shaper_name[a] = get_shaper_name(AxisEnum(a)); #endif #if HAS_DYNAMIC_FREQ - MString<20> dmode = get_dyn_freq_mode_name(); + static MString<20> dmode = get_dyn_freq_mode_name(); #endif ft_config_t &c = ftMotion.cfg; @@ -469,13 +469,13 @@ void menu_move() { void menu_tune_ft_motion() { // Define stuff ahead of the menu loop - MString<20> shaper_name[NUM_AXES_SHAPED] {}; + static MString<20> shaper_name[NUM_AXES_SHAPED] {}; #if HAS_X_AXIS for (uint_fast8_t a = X_AXIS; a < NUM_AXES_SHAPED; ++a) shaper_name[a] = get_shaper_name(AxisEnum(a)); #endif #if HAS_DYNAMIC_FREQ - MString<20> dmode = get_dyn_freq_mode_name(); + static MString<20> dmode = get_dyn_freq_mode_name(); #endif #if HAS_EXTRUDERS From c50432390256fcbc61769af63fd91dad7aff7713 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 24 May 2025 12:34:13 -0500 Subject: [PATCH 2/3] only copy on avr --- Marlin/src/lcd/menu/menu_motion.cpp | 62 +++++++++++++++++++---------- 1 file changed, 40 insertions(+), 22 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index e29f5f1b8c68..c00eb3ac3193 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -401,19 +401,29 @@ void menu_move() { #endif // HAS_DYNAMIC_FREQ + // Suppress warning about storing a stack address in a static string pointer + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdangling-pointer" + void menu_ft_motion() { // Define stuff ahead of the menu loop - static MString<20> shaper_name[NUM_AXES_SHAPED] {}; - #if HAS_X_AXIS - for (uint_fast8_t a = X_AXIS; a < NUM_AXES_SHAPED; ++a) - shaper_name[a] = get_shaper_name(AxisEnum(a)); - #endif - #if HAS_DYNAMIC_FREQ - static MString<20> dmode = get_dyn_freq_mode_name(); - #endif - ft_config_t &c = ftMotion.cfg; + #ifdef __AVR__ + // Copy Flash strings to RAM for C-string substitution + #if HAS_X_AXIS + MString<20> shaper_name; + auto _shaper_name = [&](const AxisEnum a) { shaper_name = get_shaper_name(a); return shaper_name; }; + #endif + #if HAS_DYNAMIC_FREQ + MString<20> dmode; + auto _dmode = [&]{ dmode = get_dyn_freq_mode_name(); return dmode; }; + #endif + #else + auto _shaper_name = [](const AxisEnum a) { return get_shaper_name(a); }; + auto _dmode = []{ return get_dyn_freq_mode_name(); }; + #endif + START_MENU(); BACK_ITEM(MSG_MOTION); @@ -426,7 +436,7 @@ void menu_move() { // Show only when FT Motion is active (or optionally always show) if (c.active || ENABLED(FT_MOTION_NO_MENU_TOGGLE)) { #if HAS_X_AXIS - SUBMENU_N_S(X_AXIS, shaper_name[X_AXIS], MSG_FTM_CMPN_MODE, menu_ftm_shaper_x); + SUBMENU_N_S(X_AXIS, _shaper_name(X_AXIS), MSG_FTM_CMPN_MODE, menu_ftm_shaper_x); if (AXIS_HAS_SHAPER(X)) { EDIT_ITEM_FAST_N(float42_52, X_AXIS, MSG_FTM_BASE_FREQ_N, &c.baseFreq.x, FTM_MIN_SHAPE_FREQ, (FTM_FS) / 2, ftMotion.update_shaping_params); @@ -436,7 +446,7 @@ void menu_move() { } #endif #if HAS_Y_AXIS - SUBMENU_N_S(Y_AXIS, shaper_name[Y_AXIS], MSG_FTM_CMPN_MODE, menu_ftm_shaper_y); + SUBMENU_N_S(Y_AXIS, _shaper_name(Y_AXIS), MSG_FTM_CMPN_MODE, menu_ftm_shaper_y); if (AXIS_HAS_SHAPER(Y)) { EDIT_ITEM_FAST_N(float42_52, Y_AXIS, MSG_FTM_BASE_FREQ_N, &c.baseFreq.y, FTM_MIN_SHAPE_FREQ, (FTM_FS) / 2, ftMotion.update_shaping_params); @@ -447,7 +457,7 @@ void menu_move() { #endif #if HAS_DYNAMIC_FREQ - SUBMENU_S(dmode, MSG_FTM_DYN_MODE, menu_ftm_dyn_mode); + SUBMENU_S(_dmode(), MSG_FTM_DYN_MODE, menu_ftm_dyn_mode); if (c.dynFreqMode != dynFreqMode_DISABLED) { #if HAS_X_AXIS EDIT_ITEM_FAST_N(float42_52, X_AXIS, MSG_FTM_DFREQ_K_N, &c.dynFreqK.x, 0.0f, 20.0f); @@ -469,13 +479,19 @@ void menu_move() { void menu_tune_ft_motion() { // Define stuff ahead of the menu loop - static MString<20> shaper_name[NUM_AXES_SHAPED] {}; - #if HAS_X_AXIS - for (uint_fast8_t a = X_AXIS; a < NUM_AXES_SHAPED; ++a) - shaper_name[a] = get_shaper_name(AxisEnum(a)); - #endif - #if HAS_DYNAMIC_FREQ - static MString<20> dmode = get_dyn_freq_mode_name(); + #ifdef __AVR__ + // Copy Flash strings to RAM for C-string substitution + #if HAS_X_AXIS + MString<20> shaper_name; + auto _shaper_name = [&](const AxisEnum a) { shaper_name = get_shaper_name(a); return shaper_name; }; + #endif + #if HAS_DYNAMIC_FREQ + MString<20> dmode; + auto _dmode = [&]{ dmode = get_dyn_freq_mode_name(); return dmode; }; + #endif + #else + auto _shaper_name = [](const AxisEnum a) { return get_shaper_name(a); }; + auto _dmode = []{ return get_dyn_freq_mode_name(); }; #endif #if HAS_EXTRUDERS @@ -486,13 +502,13 @@ void menu_move() { BACK_ITEM(MSG_TUNE); #if HAS_X_AXIS - SUBMENU_N_S(X_AXIS, shaper_name[X_AXIS], MSG_FTM_CMPN_MODE, menu_ftm_shaper_x); + SUBMENU_N_S(X_AXIS, _shaper_name(X_AXIS), MSG_FTM_CMPN_MODE, menu_ftm_shaper_x); #endif #if HAS_Y_AXIS - SUBMENU_N_S(Y_AXIS, shaper_name[Y_AXIS], MSG_FTM_CMPN_MODE, menu_ftm_shaper_y); + SUBMENU_N_S(Y_AXIS, _shaper_name(Y_AXIS), MSG_FTM_CMPN_MODE, menu_ftm_shaper_y); #endif #if HAS_DYNAMIC_FREQ - SUBMENU_S(dmode, MSG_FTM_DYN_MODE, menu_ftm_dyn_mode); + SUBMENU_S(_dmode(), MSG_FTM_DYN_MODE, menu_ftm_dyn_mode); #endif #if HAS_EXTRUDERS EDIT_ITEM(bool, MSG_LINEAR_ADVANCE, &c.linearAdvEna); @@ -503,6 +519,8 @@ void menu_move() { END_MENU(); } + #pragma GCC diagnostic pop + #endif // FT_MOTION_MENU void menu_motion() { From 014194d3c3bf2232729e06d4fc39c24b8703591a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 24 May 2025 12:52:45 -0500 Subject: [PATCH 3/3] customary overkill --- Marlin/src/lcd/menu/menu_motion.cpp | 42 ++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index c00eb3ac3193..956b58c63393 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -405,19 +405,38 @@ void menu_move() { #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdangling-pointer" + #if ALL(__AVR__, HAS_MARLINUI_U8GLIB) && DISABLED(REDUCE_CODE_SIZE_FOR_FT_MOTION_ON_AVR) + #define CACHE_PREV_STRING + #endif + void menu_ft_motion() { // Define stuff ahead of the menu loop ft_config_t &c = ftMotion.cfg; #ifdef __AVR__ // Copy Flash strings to RAM for C-string substitution + // For U8G paged rendering check and skip extra string copy #if HAS_X_AXIS MString<20> shaper_name; - auto _shaper_name = [&](const AxisEnum a) { shaper_name = get_shaper_name(a); return shaper_name; }; + TERN_(CACHE_PREV_STRING, int8_t prev_a = -1); + auto _shaper_name = [&](const AxisEnum a) { + if (TERN1(CACHE_PREV_STRING, a != prev_a)) { + TERN_(CACHE_PREV_STRING, prev_a = a); + shaper_name = get_shaper_name(a); + } + return shaper_name; + }; #endif #if HAS_DYNAMIC_FREQ MString<20> dmode; - auto _dmode = [&]{ dmode = get_dyn_freq_mode_name(); return dmode; }; + TERN_(CACHE_PREV_STRING, bool got_d = false); + auto _dmode = [&]{ + if (TERN1(CACHE_PREV_STRING, !got_d)) { + TERN_(CACHE_PREV_STRING, got_d = true); + dmode = get_dyn_freq_mode_name(); + } + return dmode; + }; #endif #else auto _shaper_name = [](const AxisEnum a) { return get_shaper_name(a); }; @@ -481,13 +500,28 @@ void menu_move() { // Define stuff ahead of the menu loop #ifdef __AVR__ // Copy Flash strings to RAM for C-string substitution + // For U8G paged rendering check and skip extra string copy #if HAS_X_AXIS MString<20> shaper_name; - auto _shaper_name = [&](const AxisEnum a) { shaper_name = get_shaper_name(a); return shaper_name; }; + TERN_(CACHE_PREV_STRING, int8_t prev_a = -1); + auto _shaper_name = [&](const AxisEnum a) { + if (TERN1(CACHE_PREV_STRING, a != prev_a)) { + TERN_(CACHE_PREV_STRING, prev_a = a); + shaper_name = get_shaper_name(a); + } + return shaper_name; + }; #endif #if HAS_DYNAMIC_FREQ MString<20> dmode; - auto _dmode = [&]{ dmode = get_dyn_freq_mode_name(); return dmode; }; + TERN_(CACHE_PREV_STRING, bool got_d = false); + auto _dmode = [&]{ + if (TERN1(CACHE_PREV_STRING, !got_d)) { + TERN_(CACHE_PREV_STRING, got_d = true); + dmode = get_dyn_freq_mode_name(); + } + return dmode; + }; #endif #else auto _shaper_name = [](const AxisEnum a) { return get_shaper_name(a); };