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
This commit is contained in:
Guðni Már Gilbert 2023-03-21 22:47:05 +00:00 committed by DRracer
parent 65750b9a4c
commit b9fecab239
3 changed files with 26 additions and 13 deletions

View File

@ -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

View File

@ -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;

View File

@ -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;
}
}