Scott Lahteine
7 years ago
committed by
GitHub
21 changed files with 273 additions and 268 deletions
@ -0,0 +1,133 @@ |
|||
/**
|
|||
* Marlin 3D Printer Firmware |
|||
* Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|||
* |
|||
* Based on Sprinter and grbl. |
|||
* Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU General Public License as published by |
|||
* the Free Software Foundation, either version 3 of the License, or |
|||
* (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
* |
|||
*/ |
|||
|
|||
/**
|
|||
|
|||
Busy wait delay Cycles routines: |
|||
|
|||
DELAY_CYCLES(count): Delay execution in cycles |
|||
DELAY_NS(count): Delay execution in nanoseconds |
|||
DELAY_US(count): Delay execution in microseconds |
|||
|
|||
*/ |
|||
|
|||
#ifndef MARLIN_DELAY_H |
|||
#define MARLIN_DELAY_H |
|||
|
|||
#if defined(__arm__) || defined(__thumb__) |
|||
|
|||
/* https://blueprints.launchpad.net/gcc-arm-embedded/+spec/delay-cycles */ |
|||
|
|||
#define nop() __asm__ __volatile__("nop;\n\t":::) |
|||
|
|||
FORCE_INLINE static void __delay_4cycles(uint32_t cy) { // +1 cycle
|
|||
#if ARCH_PIPELINE_RELOAD_CYCLES < 2 |
|||
#define EXTRA_NOP_CYCLES A("nop") |
|||
#else |
|||
#define EXTRA_NOP_CYCLES "" |
|||
#endif |
|||
|
|||
__asm__ __volatile__( |
|||
A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax
|
|||
L("1") |
|||
A("subs %[cnt],#1") |
|||
EXTRA_NOP_CYCLES |
|||
A("bne 1b") |
|||
: [cnt]"+r"(cy) // output: +r means input+output
|
|||
: // input:
|
|||
: "cc" // clobbers:
|
|||
); |
|||
} |
|||
|
|||
/* ---------------- Delay in cycles */ |
|||
FORCE_INLINE static void DELAY_CYCLES(uint32_t x) { |
|||
|
|||
if (__builtin_constant_p(x)) { |
|||
#define MAXNOPS 4 |
|||
|
|||
if (x <= (MAXNOPS)) { |
|||
switch (x) { case 4: nop(); case 3: nop(); case 2: nop(); case 1: nop(); } |
|||
} |
|||
else { // because of +1 cycle inside delay_4cycles
|
|||
const uint32_t rem = (x - 1) % (MAXNOPS); |
|||
switch (rem) { case 3: nop(); case 2: nop(); case 1: nop(); } |
|||
if ((x = (x - 1) / (MAXNOPS))) |
|||
__delay_4cycles(x); // if need more then 4 nop loop is more optimal
|
|||
} |
|||
#undef MAXNOPS |
|||
} |
|||
else |
|||
__delay_4cycles(x / 4); |
|||
} |
|||
#undef nop |
|||
|
|||
#elif defined(__AVR__) |
|||
|
|||
#define nop() __asm__ __volatile__("nop;\n\t":::) |
|||
|
|||
FORCE_INLINE static void __delay_4cycles(uint8_t cy) { |
|||
__asm__ __volatile__( |
|||
L("1") |
|||
A("dec %[cnt]") |
|||
A("nop") |
|||
A("brne 1b") |
|||
: [cnt] "+r"(cy) // output: +r means input+output
|
|||
: // input:
|
|||
: "cc" // clobbers:
|
|||
); |
|||
} |
|||
|
|||
/* ---------------- Delay in cycles */ |
|||
FORCE_INLINE static void DELAY_CYCLES(uint16_t x) { |
|||
|
|||
if (__builtin_constant_p(x)) { |
|||
#define MAXNOPS 4 |
|||
|
|||
if (x <= (MAXNOPS)) { |
|||
switch (x) { case 4: nop(); case 3: nop(); case 2: nop(); case 1: nop(); } |
|||
} |
|||
else { |
|||
const uint32_t rem = (x) % (MAXNOPS); |
|||
switch (rem) { case 3: nop(); case 2: nop(); case 1: nop(); } |
|||
if ((x = (x) / (MAXNOPS))) |
|||
__delay_4cycles(x); // if need more then 4 nop loop is more optimal
|
|||
} |
|||
|
|||
#undef MAXNOPS |
|||
} |
|||
else |
|||
__delay_4cycles(x / 4); |
|||
} |
|||
#undef nop |
|||
|
|||
#else |
|||
#error "Unsupported MCU architecture" |
|||
#endif |
|||
|
|||
/* ---------------- Delay in nanoseconds */ |
|||
#define DELAY_NS(x) DELAY_CYCLES( (x) * (F_CPU/1000000L) / 1000L ) |
|||
|
|||
/* ---------------- Delay in microseconds */ |
|||
#define DELAY_US(x) DELAY_CYCLES( (x) * (F_CPU/1000000L) ) |
|||
|
|||
#endif // MARLIN_DELAY_H
|
|||
|
Loading…
Reference in new issue