Optimization (6) : Using a boolean flag to keep track of when moves are done (runs out of steps) rather than checking step counter multiple times.

pull/146/head
EmbeddedMan 2020-11-19 20:38:29 -06:00
rodzic b5ff4656ba
commit 695bfa04bf
2 zmienionych plików z 34 dodań i 10 usunięć

Wyświetl plik

@ -404,18 +404,18 @@ LATDbits.LATD1 = 1;
)
{
// Only output DIR bits if we are actually doing something
if (CurrentCommand.Steps[0] || CurrentCommand.Steps[1])
if (CurrentCommand.Active[0] || CurrentCommand.Active[1])
{
if (CurrentCommand.Command == COMMAND_MOTOR_MOVE_TIMED)
{
// Has time run out for this command yet?
if (CurrentCommand.Steps[0])
if (CurrentCommand.Active[0])
{
// Nope. So count this ISR tick, and then see if we need to take a step
CurrentCommand.Steps[0]--;
if (CurrentCommand.Steps[0] != 0)
if (CurrentCommand.Steps[0] == 0)
{
AllDone = FALSE;
CurrentCommand.Active[0] = FALSE;
}
// Motor 1
@ -456,7 +456,7 @@ LATDbits.LATD1 = 1;
// This only fires if the Command is COMMAND_MOTOR_MOVE
// Only do this if there are steps left to take
if (CurrentCommand.Steps[0])
if (CurrentCommand.Active[0])
{
// For acceleration, we now add a bit to StepAdd each time through as well
CurrentCommand.Rate[0].value += CurrentCommand.Accel[0];
@ -471,10 +471,13 @@ LATDbits.LATD1 = 1;
OutByte = OutByte | STEP1_BIT;
TookStep = TRUE;
CurrentCommand.Steps[0]--;
if (CurrentCommand.Steps[0] == 0)
{
CurrentCommand.Active[0] = FALSE;
}
}
AllDone = FALSE;
}
if (CurrentCommand.Steps[1])
if (CurrentCommand.Active[1])
{
// For acceleration, we now add a bit to StepAdd each time through as well
CurrentCommand.Rate[1].value += CurrentCommand.Accel[1];
@ -489,16 +492,19 @@ LATDbits.LATD1 = 1;
OutByte = OutByte | STEP2_BIT;
TookStep = TRUE;
CurrentCommand.Steps[1]--;
if (CurrentCommand.Steps[1] == 0)
{
CurrentCommand.Active[1] = FALSE;
}
}
AllDone = FALSE;
}
// We want to allow for a one-ISR tick move, which requires us to check
// to see if the move has been completed here (to load the next command
// immediately rather than waiting for the next tick). This primarily gives
// us simpler math when figuring out how long moves will take.
if (CurrentCommand.Steps[0] == 0 && CurrentCommand.Steps[1] == 0)
if (CurrentCommand.Active[0] || CurrentCommand.Active[1])
{
AllDone = TRUE;
AllDone = FALSE;
}
}
if (TookStep)
@ -714,6 +720,23 @@ LATDbits.LATD1 = 1;
{
acc_union[1].value = 0;
}
// Set the "Active" flags for this move based on steps for each axis
if (CurrentCommand.Steps[0])
{
CurrentCommand.Active[0] = TRUE;
}
else
{
CurrentCommand.Active[0] = FALSE;
}
if (CurrentCommand.Steps[1])
{
CurrentCommand.Active[1] = TRUE;
}
else
{
CurrentCommand.Active[1] = FALSE;
}
}
FIFOEmpty = TRUE;
}

Wyświetl plik

@ -113,6 +113,7 @@ typedef struct
UINT16 ServoRate;
UINT8 SEState;
UINT16 SEPower;
UINT8 Active[NUMBER_OF_STEPPERS];
} MoveCommandType;
// Define global things that depend on the board type