Save 316 bytes by avoiding advance_spread copies
This commit is contained in:
parent
a28fb65bb2
commit
20694aeabc
|
|
@ -116,7 +116,10 @@ volatile signed char count_direction[NUM_AXIS] = { 1, 1, 1, 1};
|
||||||
void advance_isr_scheduler();
|
void advance_isr_scheduler();
|
||||||
void advance_isr();
|
void advance_isr();
|
||||||
|
|
||||||
static const uint16_t ADV_NEVER = 0xFFFF;
|
static const uint16_t ADV_NEVER = 0xFFFF;
|
||||||
|
static const uint8_t ADV_INIT = 0b01;
|
||||||
|
static const uint8_t ADV_DECELERATE = 0b10;
|
||||||
|
|
||||||
static bool use_advance_lead;
|
static bool use_advance_lead;
|
||||||
|
|
||||||
static uint16_t nextMainISR;
|
static uint16_t nextMainISR;
|
||||||
|
|
@ -771,6 +774,11 @@ FORCE_INLINE void isr() {
|
||||||
else
|
else
|
||||||
stepper_tick_highres();
|
stepper_tick_highres();
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef LIN_ADVANCE
|
||||||
|
uint8_t la_state = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Calculare new timer value
|
// Calculare new timer value
|
||||||
// 13.38-14.63us for steady state,
|
// 13.38-14.63us for steady state,
|
||||||
// 25.12us for acceleration / deceleration.
|
// 25.12us for acceleration / deceleration.
|
||||||
|
|
@ -789,10 +797,8 @@ FORCE_INLINE void isr() {
|
||||||
acceleration_time += timer;
|
acceleration_time += timer;
|
||||||
#ifdef LIN_ADVANCE
|
#ifdef LIN_ADVANCE
|
||||||
if (current_block->use_advance_lead) {
|
if (current_block->use_advance_lead) {
|
||||||
bool first = (step_events_completed.wide <= (unsigned long int)step_loops);
|
if (step_events_completed.wide <= (unsigned long int)step_loops)
|
||||||
if (first) eISR_Err = current_block->advance_rate / 2;
|
la_state = ADV_INIT;
|
||||||
if (first || nextAdvanceISR != ADV_NEVER)
|
|
||||||
advance_spread(timer);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
@ -810,20 +816,8 @@ FORCE_INLINE void isr() {
|
||||||
deceleration_time += timer;
|
deceleration_time += timer;
|
||||||
#ifdef LIN_ADVANCE
|
#ifdef LIN_ADVANCE
|
||||||
if (current_block->use_advance_lead) {
|
if (current_block->use_advance_lead) {
|
||||||
bool first = (step_events_completed.wide <= (unsigned long int)current_block->decelerate_after + step_loops);
|
if (step_events_completed.wide <= (unsigned long int)current_block->decelerate_after + step_loops)
|
||||||
if (first) eISR_Err = current_block->advance_rate / 2;
|
la_state = ADV_INIT | ADV_DECELERATE;
|
||||||
if (first || nextAdvanceISR != ADV_NEVER)
|
|
||||||
{
|
|
||||||
advance_spread(timer);
|
|
||||||
if (step_loops == e_step_loops)
|
|
||||||
LA_phase = (eISR_Rate > main_Rate);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// avoid overflow through division. warning: we need to _guarantee_ step_loops
|
|
||||||
// and e_step_loops are <= 4 due to fastdiv's limit
|
|
||||||
LA_phase = (fastdiv(eISR_Rate, step_loops) > fastdiv(main_Rate, e_step_loops));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
@ -835,15 +829,26 @@ FORCE_INLINE void isr() {
|
||||||
step_loops_nominal = step_loops;
|
step_loops_nominal = step_loops;
|
||||||
}
|
}
|
||||||
_NEXT_ISR(OCR1A_nominal);
|
_NEXT_ISR(OCR1A_nominal);
|
||||||
#ifdef LIN_ADVANCE
|
|
||||||
if (current_block->use_advance_lead && nextAdvanceISR != ADV_NEVER)
|
|
||||||
advance_spread(OCR1A_nominal);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
//WRITE_NC(LOGIC_ANALYZER_CH1, false);
|
//WRITE_NC(LOGIC_ANALYZER_CH1, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef LIN_ADVANCE
|
#ifdef LIN_ADVANCE
|
||||||
|
// avoid multiple instances or function calls to advance_spread
|
||||||
|
if (la_state & ADV_INIT) eISR_Rate = current_block->advance_rate;
|
||||||
|
if (la_state & ADV_INIT || nextAdvanceISR != ADV_NEVER) {
|
||||||
|
advance_spread(main_Rate);
|
||||||
|
if (la_state & ADV_DECELERATE) {
|
||||||
|
if (step_loops == e_step_loops)
|
||||||
|
LA_phase = (eISR_Rate > main_Rate);
|
||||||
|
else {
|
||||||
|
// avoid overflow through division. warning: we need to _guarantee_ step_loops
|
||||||
|
// and e_step_loops are <= 4 due to fastdiv's limit
|
||||||
|
LA_phase = (fastdiv(eISR_Rate, step_loops) > fastdiv(main_Rate, e_step_loops));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Check for serial chars. This executes roughtly between 50-60% of the total length of the isr,
|
// Check for serial chars. This executes roughtly between 50-60% of the total length of the isr,
|
||||||
// making this spot a much better choice than checking during esteps
|
// making this spot a much better choice than checking during esteps
|
||||||
MSerial.checkRx();
|
MSerial.checkRx();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue