From e207945154608927698538080a89eabf47b373af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gu=C3=B0ni=20M=C3=A1r=20Gilbert?= Date: Wed, 25 Oct 2023 17:36:15 +0000 Subject: [PATCH 1/2] MBL: optimise EEPROM read/writes --- Firmware/mesh_bed_calibration.cpp | 52 +++++++++++-------------------- 1 file changed, 18 insertions(+), 34 deletions(-) diff --git a/Firmware/mesh_bed_calibration.cpp b/Firmware/mesh_bed_calibration.cpp index ca444fcbe..b2d9c3819 100644 --- a/Firmware/mesh_bed_calibration.cpp +++ b/Firmware/mesh_bed_calibration.cpp @@ -793,12 +793,9 @@ static inline bool vec_undef(const float v[2]) */ void world2machine_read_valid(float vec_x[2], float vec_y[2], float cntr[2]) { - vec_x[0] = eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_VEC_X +0)); - vec_x[1] = eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_VEC_X +4)); - vec_y[0] = eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_VEC_Y +0)); - vec_y[1] = eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_VEC_Y +4)); - cntr[0] = eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_CENTER+0)); - cntr[1] = eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_CENTER+4)); + eeprom_read_block(&vec_x[0], (float*)(EEPROM_BED_CALIBRATION_VEC_X), 8); + eeprom_read_block(&vec_y[0], (float*)(EEPROM_BED_CALIBRATION_VEC_Y), 8); + eeprom_read_block(&cntr[0], (float*)(EEPROM_BED_CALIBRATION_CENTER), 8); bool reset = false; if (vec_undef(cntr) || vec_undef(vec_x) || vec_undef(vec_y)) @@ -2444,15 +2441,12 @@ BedSkewOffsetDetectionResultType find_bed_offset_and_skew(int8_t verbosity_level if (result >= 0) { DBG(_n("Calibration success.\n")); world2machine_update(vec_x, vec_y, cntr); -#if 1 + // Fearlessly store the calibration values into the eeprom. - eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_CENTER + 0), cntr[0]); - eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_CENTER + 4), cntr[1]); - eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_VEC_X + 0), vec_x[0]); - eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_VEC_X + 4), vec_x[1]); - eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_VEC_Y + 0), vec_y[0]); - eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_VEC_Y + 4), vec_y[1]); -#endif + eeprom_update_block(&cntr[0], (float*)(EEPROM_BED_CALIBRATION_CENTER), 8); + eeprom_update_block(&vec_x[0], (float*)(EEPROM_BED_CALIBRATION_VEC_X), 8); + eeprom_update_block(&vec_y[0], (float*)(EEPROM_BED_CALIBRATION_VEC_Y), 8); + #ifdef SUPPORT_VERBOSITY if (verbosity_level >= 10) { // Length of the vec_x @@ -2735,15 +2729,11 @@ BedSkewOffsetDetectionResultType improve_bed_offset_and_skew(int8_t method, int8 } world2machine_update(vec_x, vec_y, cntr); -#if 1 + // Fearlessly store the calibration values into the eeprom. - eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_CENTER+0), cntr [0]); - eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_CENTER+4), cntr [1]); - eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_VEC_X +0), vec_x[0]); - eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_VEC_X +4), vec_x[1]); - eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_VEC_Y +0), vec_y[0]); - eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_VEC_Y +4), vec_y[1]); -#endif + eeprom_update_block(&cntr[0], (float*)(EEPROM_BED_CALIBRATION_CENTER), 8); + eeprom_update_block(&vec_x[0], (float*)(EEPROM_BED_CALIBRATION_VEC_X), 8); + eeprom_update_block(&vec_y[0], (float*)(EEPROM_BED_CALIBRATION_VEC_Y), 8); // Correct the current_position to match the transformed coordinate system after world2machine_rotation_and_skew and world2machine_shift were set. world2machine_update_current(); @@ -3102,18 +3092,12 @@ void babystep_reset() } void count_xyz_details(float (&distanceMin)[2]) { - float cntr[2] = { - eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_CENTER + 0)), - eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_CENTER + 4)) - }; - float vec_x[2] = { - eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_VEC_X + 0)), - eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_VEC_X + 4)) - }; - float vec_y[2] = { - eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_VEC_Y + 0)), - eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_VEC_Y + 4)) - }; + float cntr[2]; + float vec_x[2]; + float vec_y[2]; + eeprom_read_block(&cntr[0], (float*)(EEPROM_BED_CALIBRATION_CENTER), 8); + eeprom_read_block(&vec_x[0], (float*)(EEPROM_BED_CALIBRATION_VEC_X), 8); + eeprom_read_block(&vec_y[0], (float*)(EEPROM_BED_CALIBRATION_VEC_Y), 8); #if 0 a2 = -1 * asin(vec_y[0] / MACHINE_AXIS_SCALE_Y); a1 = asin(vec_x[1] / MACHINE_AXIS_SCALE_X); From 3297429ca7d998c998f0f775b62c7ad38c37eccc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gu=C3=B0ni=20M=C3=A1r=20Gilbert?= Date: Wed, 25 Oct 2023 17:37:04 +0000 Subject: [PATCH 2/2] TM: Optimise EEPROM read and writes --- Firmware/temperature.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp index b932e0dd5..cd453795d 100755 --- a/Firmware/temperature.cpp +++ b/Firmware/temperature.cpp @@ -2417,8 +2417,7 @@ void thermal_model_load_settings() thermal_model::data.C = eeprom_read_float((float*)EEPROM_THERMAL_MODEL_C); thermal_model::data.fS = eeprom_read_float((float*)EEPROM_THERMAL_MODEL_D); thermal_model_set_lag(eeprom_read_word((uint16_t*)EEPROM_THERMAL_MODEL_L)); - for(uint8_t i = 0; i != THERMAL_MODEL_R_SIZE; ++i) - thermal_model::data.R[i] = eeprom_read_float((float*)EEPROM_THERMAL_MODEL_R + i); + eeprom_read_block(&thermal_model::data.R[0], (float*)EEPROM_THERMAL_MODEL_R, THERMAL_MODEL_R_SIZE * sizeof(float)); thermal_model::data.Ta_corr = eeprom_read_float((float*)EEPROM_THERMAL_MODEL_Ta_corr); thermal_model::data.warn = eeprom_read_float((float*)EEPROM_THERMAL_MODEL_W); thermal_model::data.err = eeprom_read_float((float*)EEPROM_THERMAL_MODEL_E); @@ -2439,8 +2438,7 @@ void thermal_model_save_settings() eeprom_update_float((float*)EEPROM_THERMAL_MODEL_C, thermal_model::data.C); eeprom_update_float((float*)EEPROM_THERMAL_MODEL_D, thermal_model::data.fS); eeprom_update_word((uint16_t*)EEPROM_THERMAL_MODEL_L, thermal_model::data.L); - for(uint8_t i = 0; i != THERMAL_MODEL_R_SIZE; ++i) - eeprom_update_float((float*)EEPROM_THERMAL_MODEL_R + i, thermal_model::data.R[i]); + eeprom_update_block(&thermal_model::data.R[0], (float*)EEPROM_THERMAL_MODEL_R, THERMAL_MODEL_R_SIZE * sizeof(float)); eeprom_update_float((float*)EEPROM_THERMAL_MODEL_Ta_corr, thermal_model::data.Ta_corr); eeprom_update_float((float*)EEPROM_THERMAL_MODEL_W, thermal_model::data.warn); eeprom_update_float((float*)EEPROM_THERMAL_MODEL_E, thermal_model::data.err);