Guard ISR-processed data in ATOMIC_BLOCK
parent
8e8a17c34e
commit
90be0f8665
|
|
@ -1,6 +1,12 @@
|
|||
/// @file pulse_gen.cpp
|
||||
#include "pulse_gen.h"
|
||||
|
||||
#ifdef AVR
|
||||
#include <util/atomic.h>
|
||||
#else
|
||||
#define ATOMIC_BLOCK(x) /**/
|
||||
#endif
|
||||
|
||||
namespace modules {
|
||||
namespace pulse_gen {
|
||||
|
||||
|
|
@ -90,6 +96,7 @@ void PulseGen::CalculateTrapezoid(block_t *block, steps_t entry_speed, steps_t e
|
|||
}
|
||||
|
||||
bool PulseGen::PlanMoveTo(pos_t target, steps_t feed_rate, steps_t end_rate) {
|
||||
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
|
||||
// Prepare to set up new block
|
||||
if (block_index.full())
|
||||
return false;
|
||||
|
|
@ -123,12 +130,14 @@ bool PulseGen::PlanMoveTo(pos_t target, steps_t feed_rate, steps_t end_rate) {
|
|||
|
||||
// Move forward and update the state
|
||||
block_index.push();
|
||||
}
|
||||
position = target;
|
||||
return true;
|
||||
}
|
||||
|
||||
pos_t PulseGen::CurPosition() const {
|
||||
pos_t cur_pos = position;
|
||||
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { // manipulating current_block needs sync
|
||||
circular_index_t iter = block_index;
|
||||
|
||||
// if we have a live block remove the partial offset
|
||||
|
|
@ -142,7 +151,7 @@ pos_t PulseGen::CurPosition() const {
|
|||
cur_pos -= BlockShift(&block_buffer[iter.front()]);
|
||||
iter.pop();
|
||||
}
|
||||
|
||||
}
|
||||
return cur_pos;
|
||||
}
|
||||
|
||||
|
|
@ -150,6 +159,7 @@ void PulseGen::AbortPlannedMoves(bool halt) {
|
|||
// always update to effective position
|
||||
position = CurPosition();
|
||||
|
||||
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { // manipulating current_block needs sync
|
||||
// destroy the current block
|
||||
if (current_block) {
|
||||
last_rate = acc_step_rate;
|
||||
|
|
@ -157,10 +167,11 @@ void PulseGen::AbortPlannedMoves(bool halt) {
|
|||
while (!block_index.empty()) // drop all remaining blocks
|
||||
block_index.pop();
|
||||
}
|
||||
|
||||
}
|
||||
// truncate the last rate if halting
|
||||
if (halt)
|
||||
if (halt) {
|
||||
last_rate = 0;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace motor
|
||||
|
|
|
|||
|
|
@ -74,6 +74,7 @@ public:
|
|||
bool Full() const { return block_index.full(); }
|
||||
|
||||
/// Single-step the axis
|
||||
/// Called from ISR
|
||||
/// @returns the interval for the next tick
|
||||
inline st_timer_t Step(const hal::tmc2130::MotorParams &motorParams) {
|
||||
if (!current_block) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue