From b9fecab2398a67102f1323757060670bb2535c93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gu=C3=B0ni=20M=C3=A1r=20Gilbert?= Date: Tue, 21 Mar 2023 22:47:05 +0000 Subject: [PATCH] Reduce calls to __divsf3 when calculating feedrate For non-time critical code it is more effcient to call a function rather inlining each division operation. Change in memory: Flash: -122 bytes SRAM: 0 bytes --- Firmware/Marlin.h | 5 +++++ Firmware/Marlin_main.cpp | 32 ++++++++++++++++++++------------ Firmware/ultralcd.cpp | 2 +- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index 1cef467d6..53f415b9d 100755 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -287,6 +287,11 @@ void prepare_move(uint16_t start_segment_idx = 0); void prepare_arc_move(bool isclockwise, uint16_t start_segment_idx = 0); uint16_t restore_interrupted_gcode(); +///@brief Helper function to reduce code size, cheaper to call function than to inline division +///@param feedrate_mm_min feedrate with unit mm per minute +///@returns feedrate with unit mm per second +float __attribute__((noinline)) get_feedrate_mm_s(const float feedrate_mm_min); + #ifdef TMC2130 void homeaxis(uint8_t axis, uint8_t cnt = 1, uint8_t* pstep = 0); #else diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index d93a853e8..50453ae07 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -2217,6 +2217,10 @@ static void check_Z_crash(void) } #endif //TMC2130 +float __attribute__((noinline)) get_feedrate_mm_s(const float feedrate_mm_min) { + return feedrate_mm_min / 60.f; +} + #ifdef TMC2130 void homeaxis(uint8_t axis, uint8_t cnt, uint8_t* pstep) #else @@ -2230,6 +2234,7 @@ void homeaxis(uint8_t axis, uint8_t cnt) { int axis_home_dir = home_dir(axis); feedrate = homing_feedrate[axis]; + float feedrate_mm_s = get_feedrate_mm_s(feedrate); #ifdef TMC2130 tmc2130_home_enter(X_AXIS_MASK << axis); @@ -2244,7 +2249,7 @@ void homeaxis(uint8_t axis, uint8_t cnt) set_destination_to_current(); // destination[axis] = 11.f; destination[axis] = -3.f * axis_home_dir; - plan_buffer_line_destinationXYZE(feedrate/60); + plan_buffer_line_destinationXYZE(feedrate_mm_s); st_synchronize(); // Move away from the possible collision with opposite endstop with the collision detection disabled. endstops_hit_on_purpose(); @@ -2252,12 +2257,12 @@ void homeaxis(uint8_t axis, uint8_t cnt) current_position[axis] = 0; plan_set_position_curposXYZE(); destination[axis] = 1. * axis_home_dir; - plan_buffer_line_destinationXYZE(feedrate/60); + plan_buffer_line_destinationXYZE(feedrate_mm_s); st_synchronize(); // Now continue to move up to the left end stop with the collision detection enabled. enable_endstops(true); destination[axis] = 1.1 * axis_home_dir * max_length(axis); - plan_buffer_line_destinationXYZE(feedrate/60); + plan_buffer_line_destinationXYZE(feedrate_mm_s); st_synchronize(); for (uint8_t i = 0; i < cnt; i++) { @@ -2267,7 +2272,7 @@ void homeaxis(uint8_t axis, uint8_t cnt) current_position[axis] = 0; plan_set_position_curposXYZE(); destination[axis] = -10.f * axis_home_dir; - plan_buffer_line_destinationXYZE(feedrate/60); + plan_buffer_line_destinationXYZE(feedrate_mm_s); st_synchronize(); endstops_hit_on_purpose(); // Now move left up to the collision, this time with a repeatable velocity. @@ -2277,8 +2282,9 @@ void homeaxis(uint8_t axis, uint8_t cnt) feedrate = homing_feedrate[axis]; #else //TMC2130 feedrate = homing_feedrate[axis] / 2; + feedrate_mm_s = get_feedrate_mm_s(feedrate); #endif //TMC2130 - plan_buffer_line_destinationXYZE(feedrate/60); + plan_buffer_line_destinationXYZE(feedrate_mm_s); st_synchronize(); #ifdef TMC2130 uint16_t mscnt = tmc2130_rd_MSCNT(axis); @@ -2315,7 +2321,7 @@ void homeaxis(uint8_t axis, uint8_t cnt) plan_set_position_curposXYZE(); current_position[axis] += dist; destination[axis] = current_position[axis]; - plan_buffer_line_destinationXYZE(0.5f*feedrate/60); + plan_buffer_line_destinationXYZE(0.5f*feedrate_mm_s); st_synchronize(); feedrate = 0.0; @@ -2330,7 +2336,8 @@ void homeaxis(uint8_t axis, uint8_t cnt) plan_set_position_curposXYZE(); destination[axis] = 1.5 * max_length(axis) * axis_home_dir; feedrate = homing_feedrate[axis]; - plan_buffer_line_destinationXYZE(feedrate/60); + float feedrate_mm_s = get_feedrate_mm_s(feedrate); + plan_buffer_line_destinationXYZE(feedrate_mm_s); st_synchronize(); #ifdef TMC2130 check_Z_crash(); @@ -2338,11 +2345,12 @@ void homeaxis(uint8_t axis, uint8_t cnt) current_position[axis] = 0; plan_set_position_curposXYZE(); destination[axis] = -home_retract_mm(axis) * axis_home_dir; - plan_buffer_line_destinationXYZE(feedrate/60); + plan_buffer_line_destinationXYZE(feedrate_mm_s); st_synchronize(); destination[axis] = 2*home_retract_mm(axis) * axis_home_dir; - feedrate = homing_feedrate[axis]/2 ; - plan_buffer_line_destinationXYZE(feedrate/60); + feedrate = homing_feedrate[axis] / 2; + feedrate_mm_s = get_feedrate_mm_s(feedrate); + plan_buffer_line_destinationXYZE(feedrate_mm_s); st_synchronize(); #ifdef TMC2130 check_Z_crash(); @@ -6888,7 +6896,7 @@ Sigma_Exit: } if(code_seen('F')) { - cs.retract_feedrate = code_value()/60 ; + cs.retract_feedrate = get_feedrate_mm_s(code_value()); } if(code_seen('Z')) { @@ -6914,7 +6922,7 @@ Sigma_Exit: } if(code_seen('F')) { - cs.retract_recover_feedrate = code_value()/60 ; + cs.retract_recover_feedrate = get_feedrate_mm_s(code_value()); } }break; diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index fc47959eb..dab05eb25 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -2420,7 +2420,7 @@ static void _lcd_move(const char *name, uint8_t axis, int min, int max) if (max_software_endstops && current_position[axis] > max) current_position[axis] = max; lcd_encoder = 0; world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]); - plan_buffer_line_curposXYZE(manual_feedrate[axis] / 60); + plan_buffer_line_curposXYZE(get_feedrate_mm_s(manual_feedrate[axis])); lcd_draw_update = 1; } }