Преглед изворни кода

Spend 48b PROGMEM to save 16b SRAM

...by moving `homing_feedrate_mm_s` to PROGMEM.
Scott Lahteine пре 8 година
родитељ
комит
e6d10f6ddd
1 измењених фајлова са 16 додато и 14 уклоњено
  1. 16
    14
      Marlin/Marlin_main.cpp

+ 16
- 14
Marlin/Marlin_main.cpp Прегледај датотеку

@@ -389,7 +389,7 @@ static const char *injected_commands_P = NULL;
389 389
  * Feed rates are often configured with mm/m
390 390
  * but the planner and stepper like mm/s units.
391 391
  */
392
-float constexpr homing_feedrate_mm_s[] = {
392
+static const float homing_feedrate_mm_s[] PROGMEM = {
393 393
   #if ENABLED(DELTA)
394 394
     MMM_TO_MMS(HOMING_FEEDRATE_Z), MMM_TO_MMS(HOMING_FEEDRATE_Z),
395 395
   #else
@@ -397,6 +397,8 @@ float constexpr homing_feedrate_mm_s[] = {
397 397
   #endif
398 398
   MMM_TO_MMS(HOMING_FEEDRATE_Z), 0
399 399
 };
400
+FORCE_INLINE float homing_feedrate(const AxisEnum a) { return pgm_read_float(&homing_feedrate_mm_s[a]); }
401
+
400 402
 float feedrate_mm_s = MMM_TO_MMS(1500.0);
401 403
 static float saved_feedrate_mm_s;
402 404
 int feedrate_percentage = 100, saved_feedrate_percentage,
@@ -1504,7 +1506,7 @@ inline float get_homing_bump_feedrate(const AxisEnum axis) {
1504 1506
     SERIAL_ECHO_START;
1505 1507
     SERIAL_ECHOLNPGM("Warning: Homing Bump Divisor < 1");
1506 1508
   }
1507
-  return homing_feedrate_mm_s[axis] / hbd;
1509
+  return homing_feedrate(axis) / hbd;
1508 1510
 }
1509 1511
 
1510 1512
 /**
@@ -1631,7 +1633,7 @@ void do_blocking_move_to(const float &x, const float &y, const float &z, const f
1631 1633
     // If Z needs to raise, do it before moving XY
1632 1634
     if (destination[Z_AXIS] < z) {
1633 1635
       destination[Z_AXIS] = z;
1634
-      prepare_uninterpolated_move_to_destination(fr_mm_s ? fr_mm_s : homing_feedrate_mm_s[Z_AXIS]);
1636
+      prepare_uninterpolated_move_to_destination(fr_mm_s ? fr_mm_s : homing_feedrate(Z_AXIS));
1635 1637
     }
1636 1638
 
1637 1639
     destination[X_AXIS] = x;
@@ -1641,14 +1643,14 @@ void do_blocking_move_to(const float &x, const float &y, const float &z, const f
1641 1643
     // If Z needs to lower, do it after moving XY
1642 1644
     if (destination[Z_AXIS] > z) {
1643 1645
       destination[Z_AXIS] = z;
1644
-      prepare_uninterpolated_move_to_destination(fr_mm_s ? fr_mm_s : homing_feedrate_mm_s[Z_AXIS]);
1646
+      prepare_uninterpolated_move_to_destination(fr_mm_s ? fr_mm_s : homing_feedrate(Z_AXIS));
1645 1647
     }
1646 1648
 
1647 1649
   #else
1648 1650
 
1649 1651
     // If Z needs to raise, do it before moving XY
1650 1652
     if (current_position[Z_AXIS] < z) {
1651
-      feedrate_mm_s = fr_mm_s ? fr_mm_s : homing_feedrate_mm_s[Z_AXIS];
1653
+      feedrate_mm_s = fr_mm_s ? fr_mm_s : homing_feedrate(Z_AXIS);
1652 1654
       current_position[Z_AXIS] = z;
1653 1655
       line_to_current_position();
1654 1656
     }
@@ -1660,7 +1662,7 @@ void do_blocking_move_to(const float &x, const float &y, const float &z, const f
1660 1662
 
1661 1663
     // If Z needs to lower, do it after moving XY
1662 1664
     if (current_position[Z_AXIS] > z) {
1663
-      feedrate_mm_s = fr_mm_s ? fr_mm_s : homing_feedrate_mm_s[Z_AXIS];
1665
+      feedrate_mm_s = fr_mm_s ? fr_mm_s : homing_feedrate(Z_AXIS);
1664 1666
       current_position[Z_AXIS] = z;
1665 1667
       line_to_current_position();
1666 1668
     }
@@ -2778,11 +2780,11 @@ static void do_homing_move(const AxisEnum axis, const float distance, const floa
2778 2780
     SYNC_PLAN_POSITION_KINEMATIC();
2779 2781
     current_position[axis] = distance;
2780 2782
     inverse_kinematics(current_position);
2781
-    planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], current_position[E_AXIS], fr_mm_s ? fr_mm_s : homing_feedrate_mm_s[axis], active_extruder);
2783
+    planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], current_position[E_AXIS], fr_mm_s ? fr_mm_s : homing_feedrate(axis), active_extruder);
2782 2784
   #else
2783 2785
     sync_plan_position();
2784 2786
     current_position[axis] = distance;
2785
-    planner.buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], fr_mm_s ? fr_mm_s : homing_feedrate_mm_s[axis], active_extruder);
2787
+    planner.buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], fr_mm_s ? fr_mm_s : homing_feedrate(axis), active_extruder);
2786 2788
   #endif
2787 2789
 
2788 2790
   stepper.synchronize();
@@ -3397,7 +3399,7 @@ inline void gcode_G4() {
3397 3399
     const float mlx = max_length(X_AXIS),
3398 3400
                 mly = max_length(Y_AXIS),
3399 3401
                 mlratio = mlx > mly ? mly / mlx : mlx / mly,
3400
-                fr_mm_s = min(homing_feedrate_mm_s[X_AXIS], homing_feedrate_mm_s[Y_AXIS]) * sqrt(sq(mlratio) + 1.0);
3402
+                fr_mm_s = min(homing_feedrate(X_AXIS), homing_feedrate(Y_AXIS)) * sqrt(sq(mlratio) + 1.0);
3401 3403
 
3402 3404
     do_blocking_move_to_xy(1.5 * mlx * x_axis_home_dir, 1.5 * mly * home_dir(Y_AXIS), fr_mm_s);
3403 3405
     endstops.hit_on_purpose(); // clear endstop hit flags
@@ -3540,7 +3542,7 @@ inline void gcode_G4() {
3540 3542
 
3541 3543
     // Move all carriages together linearly until an endstop is hit.
3542 3544
     current_position[X_AXIS] = current_position[Y_AXIS] = current_position[Z_AXIS] = (Z_MAX_LENGTH + 10);
3543
-    feedrate_mm_s = homing_feedrate_mm_s[X_AXIS];
3545
+    feedrate_mm_s = homing_feedrate(X_AXIS);
3544 3546
     line_to_current_position();
3545 3547
     stepper.synchronize();
3546 3548
     endstops.hit_on_purpose(); // clear endstop hit flags
@@ -3853,7 +3855,7 @@ void home_all_axes() { gcode_G28(true); }
3853 3855
     const float old_feedrate_mm_s = feedrate_mm_s;
3854 3856
 
3855 3857
     #if MANUAL_PROBE_HEIGHT > 0
3856
-      feedrate_mm_s = homing_feedrate_mm_s[Z_AXIS];
3858
+      feedrate_mm_s = homing_feedrate(Z_AXIS);
3857 3859
       current_position[Z_AXIS] = LOGICAL_Z_POSITION(Z_MIN_POS) + MANUAL_PROBE_HEIGHT;
3858 3860
       line_to_current_position();
3859 3861
     #endif
@@ -3864,7 +3866,7 @@ void home_all_axes() { gcode_G28(true); }
3864 3866
     line_to_current_position();
3865 3867
 
3866 3868
     #if MANUAL_PROBE_HEIGHT > 0
3867
-      feedrate_mm_s = homing_feedrate_mm_s[Z_AXIS];
3869
+      feedrate_mm_s = homing_feedrate(Z_AXIS);
3868 3870
       current_position[Z_AXIS] = LOGICAL_Z_POSITION(Z_MIN_POS); // just slightly over the bed
3869 3871
       line_to_current_position();
3870 3872
     #endif
@@ -3900,7 +3902,7 @@ void home_all_axes() { gcode_G28(true); }
3900 3902
     #if ENABLED(MESH_G28_REST_ORIGIN)
3901 3903
       current_position[Z_AXIS] = LOGICAL_Z_POSITION(Z_MIN_POS);
3902 3904
       set_destination_to_current();
3903
-      line_to_destination(homing_feedrate_mm_s[Z_AXIS]);
3905
+      line_to_destination(homing_feedrate(Z_AXIS));
3904 3906
       stepper.synchronize();
3905 3907
     #endif
3906 3908
   }
@@ -5502,7 +5504,7 @@ void home_all_axes() { gcode_G28(true); }
5502 5504
     // If any axis has enough movement, do the move
5503 5505
     LOOP_XYZ(i)
5504 5506
       if (fabs(destination[i] - current_position[i]) >= G38_MINIMUM_MOVE) {
5505
-        if (!parser.seen('F')) feedrate_mm_s = homing_feedrate_mm_s[i];
5507
+        if (!parser.seen('F')) feedrate_mm_s = homing_feedrate(i);
5506 5508
         // If G38.2 fails throw an error
5507 5509
         if (!G38_run_probe() && is_38_2) {
5508 5510
           SERIAL_ERROR_START;

Loading…
Откажи
Сачувај