From af25fb286e90bea499ec1485af21e483ef5a3ea1 Mon Sep 17 00:00:00 2001 From: David Crocker Date: Tue, 24 Jan 2017 15:56:11 +0000 Subject: [PATCH] Version 1.17c+2 Fixed bug in G2 and G3 commands (I and J parameters were not always being assumed to be relative to current X and Y) Hard fauld handler now stores the faulting PC and status registers in the software reset data --- ...17c+1.bin => DuetWiFiFirmware-1.17c+2.bin} | Bin 276884 -> 277060 bytes src/GCodes/GCodes.cpp | 25 ++---- src/Movement/DDA.cpp | 5 +- src/Platform.cpp | 73 +++++++++++++++--- src/Platform.h | 18 +++-- src/Reprap.cpp | 12 +++ src/Reprap.h | 2 + src/Version.h | 4 +- 8 files changed, 100 insertions(+), 39 deletions(-) rename Release/Duet-WiFi/Edge/{DuetWiFiFirmware-1.17c+1.bin => DuetWiFiFirmware-1.17c+2.bin} (63%) diff --git a/Release/Duet-WiFi/Edge/DuetWiFiFirmware-1.17c+1.bin b/Release/Duet-WiFi/Edge/DuetWiFiFirmware-1.17c+2.bin similarity index 63% rename from Release/Duet-WiFi/Edge/DuetWiFiFirmware-1.17c+1.bin rename to Release/Duet-WiFi/Edge/DuetWiFiFirmware-1.17c+2.bin index 143a63af043fd63aed89041092f406b8c61c8227..851869a0365632c2fc3710bdf6fc531177a07159 100644 GIT binary patch delta 52088 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 Cqa<|z delta 52107 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 diff --git a/src/GCodes/GCodes.cpp b/src/GCodes/GCodes.cpp index 6add927..bf5f2d9 100644 --- a/src/GCodes/GCodes.cpp +++ b/src/GCodes/GCodes.cpp @@ -1359,7 +1359,9 @@ bool GCodes::DoArcMove(GCodeBuffer& gb, bool clockwise) } } - float initialDx = 0.0; + // The I and J parameters are always relative to present position + arcCentre[Y_AXIS] = moveBuffer.initialCoords[Y_AXIS] + jParam; + if (currentTool != nullptr) { // Record which axes behave like an X axis @@ -1369,30 +1371,25 @@ bool GCodes::DoArcMove(GCodeBuffer& gb, bool clockwise) if (axesRelative) { moveBuffer.coords[Y_AXIS] += yParam; - arcCentre[Y_AXIS] = moveBuffer.initialCoords[Y_AXIS] + jParam; } else { moveBuffer.coords[Y_AXIS] = yParam - currentTool->GetOffset()[Y_AXIS]; - arcCentre[Y_AXIS] = jParam - currentTool->GetOffset()[Y_AXIS]; } // Deal with the X axes for (size_t axis = 0; axis < numAxes; ++axis) { + arcCentre[axis] = moveBuffer.initialCoords[axis] + iParam; if ((arcAxesMoving & (1 << axis)) != 0) { if (axesRelative) { moveBuffer.coords[axis] += xParam; - arcCentre[axis] = moveBuffer.initialCoords[axis] + iParam; - initialDx = -iParam; } else { moveBuffer.coords[axis] = xParam - currentTool->GetOffset()[axis]; - arcCentre[axis] = iParam + currentTool->GetOffset()[axis]; - initialDx = moveBuffer.initialCoords[axis] - arcCentre[axis]; } } } @@ -1400,21 +1397,16 @@ bool GCodes::DoArcMove(GCodeBuffer& gb, bool clockwise) else { arcAxesMoving = (1 << X_AXIS); + arcCentre[X_AXIS] = moveBuffer.initialCoords[X_AXIS] + iParam; if (axesRelative) { moveBuffer.coords[X_AXIS] += xParam; - arcCentre[X_AXIS] = moveBuffer.initialCoords[X_AXIS] + iParam; moveBuffer.coords[Y_AXIS] += yParam; - arcCentre[Y_AXIS] = moveBuffer.initialCoords[Y_AXIS] + jParam;; - initialDx = -iParam; } else { moveBuffer.coords[X_AXIS] = xParam; - arcCentre[X_AXIS] = iParam; moveBuffer.coords[Y_AXIS] = yParam; - arcCentre[Y_AXIS] = jParam; - initialDx = moveBuffer.initialCoords[X_AXIS] - arcCentre[X_AXIS]; } } @@ -1423,10 +1415,9 @@ bool GCodes::DoArcMove(GCodeBuffer& gb, bool clockwise) moveBuffer.xAxes = reprap.GetCurrentXAxes(); if (LoadExtrusionAndFeedrateFromGCode(gb, moveBuffer.moveType)) // this reports an error if necessary, so no need to return true if it fails { - const float initialDy = moveBuffer.initialCoords[Y_AXIS] - arcCentre[Y_AXIS]; - arcRadius = sqrtf(initialDx * initialDx + initialDy * initialDy); - arcCurrentAngle = atan2(initialDy, initialDx); - const float finalTheta = atan2(yParam - jParam, xParam - iParam); + arcRadius = sqrtf(iParam * iParam + jParam * jParam); + arcCurrentAngle = atan2(-jParam, -iParam); + const float finalTheta = atan2(moveBuffer.coords[Y_AXIS] - arcCentre[Y_AXIS], moveBuffer.coords[X_AXIS] - arcCentre[X_AXIS]); // Calculate the total angle moved, which depends on which way round we are going float totalArc = (clockwise) ? arcCurrentAngle - finalTheta : finalTheta - arcCurrentAngle; diff --git a/src/Movement/DDA.cpp b/src/Movement/DDA.cpp index 20d98b3..74d614c 100644 --- a/src/Movement/DDA.cpp +++ b/src/Movement/DDA.cpp @@ -554,7 +554,10 @@ pre(state == provisional) // Still going up laDDA = laDDA->prev; ++laDepth; - if (reprap.Debug(moduleDda)) debugPrintf("Recursion start %u\n", laDepth); + if (reprap.Debug(moduleDda)) + { + debugPrintf("Recursion start %u\n", laDepth); + } } else { diff --git a/src/Platform.cpp b/src/Platform.cpp index 16c460a..79252b9 100644 --- a/src/Platform.cpp +++ b/src/Platform.cpp @@ -84,7 +84,7 @@ void UrgentInit() { #ifdef DUET_NG // When the reset button is pressed on pre-production Duet WiFi boards, if the TMC2660 drivers were previously enabled then we get - // uncommanded motor movements if the STEP lines pick up any noise. Try to reduce that by initialising the drivers early here. + // uncommanded motor movements if the STEP lines pick up any noise. Try to reduce that by initialising the pins that control the drivers early here. // On the production boards the ENN line is pulled high and that prevents motor movements. for (size_t drive = 0; drive < DRIVES; ++drive) { @@ -107,6 +107,16 @@ void setup() *heapend++ = memPattern; } + // Trap integer divide-by-zero. + // We could also trap unaligned memory access, if we change the gcc options to not generate code that uses unaligned memory access. + SCB->CCR |= SCB_CCR_DIV_0_TRP_Msk; + + // When doing a software reset, we disable the NRST input (User reset) to prevent the negative-going pulse that gets generated on it + // being held in the capacitor and changing the reset reason form Software to User. So enable it again here. We hope that the reset signal + // will have gone away by now. + RSTC->RSTC_MR = RSTC_MR_KEY_PASSWD | RSTC_MR_URSTEN; // ignore any signal on the NRST pin for now so that the reset reason will show as Software + + // Go on and do the main initialisation reprap.Init(); } @@ -124,18 +134,42 @@ extern "C" return 0; } + // Exception handlers + // By default the Usage Fault, Bus Fault and Memory Management fault handlers are not enabled, + // so they escalate to a Hard Fault and we don't need to provide separate exception handlers for them. + // We can get information on what caused a Hard Fault form the status registers. + // Also get the program counter when the exception occurred. + void prvGetRegistersFromStack(const uint32_t *pulFaultStackAddress) + { + const uint32_t pc = pulFaultStackAddress[6]; + reprap.GetPlatform()->SoftwareReset((uint16_t)SoftwareResetReason::hardFault, pc); + } + + // The fault handler implementation calls a function called prvGetRegistersFromStack() + void HardFault_Handler() __attribute__((naked)); + void HardFault_Handler() + { + __asm volatile + ( + " tst lr, #4 \n" + " ite eq \n" + " mrseq r0, msp \n" + " mrsne r0, psp \n" + " ldr r1, [r0, #24] \n" + " ldr r2, handler2_address_const \n" + " bx r2 \n" + " handler2_address_const: .word prvGetRegistersFromStack \n" + ); + } + + // We could set up the following fault handlers to retrieve the program counter in the same way as for a Hard Fault, + // however these exceptions are unlikely to occur, so for now we just report the exception type. void NMI_Handler () { reprap.GetPlatform()->SoftwareReset((uint16_t)SoftwareResetReason::NMI); } - void HardFault_Handler () { reprap.GetPlatform()->SoftwareReset((uint16_t)SoftwareResetReason::hardFault); } - void MemManage_Handler () { reprap.GetPlatform()->SoftwareReset((uint16_t)SoftwareResetReason::memManage); } - void BusFault_Handler () { reprap.GetPlatform()->SoftwareReset((uint16_t)SoftwareResetReason::busFault); } - void UsageFault_Handler () { reprap.GetPlatform()->SoftwareReset((uint16_t)SoftwareResetReason::usageFault); } void SVC_Handler () { reprap.GetPlatform()->SoftwareReset((uint16_t)SoftwareResetReason::otherFault); } void DebugMon_Handler () { reprap.GetPlatform()->SoftwareReset((uint16_t)SoftwareResetReason::otherFault); } void PendSV_Handler () { reprap.GetPlatform()->SoftwareReset((uint16_t)SoftwareResetReason::otherFault); } } - - // ZProbeParameters class void ZProbeParameters::Init(float h) @@ -1181,7 +1215,7 @@ void Platform::Spin() ClassReport(longWait); } -void Platform::SoftwareReset(uint16_t reason) +void Platform::SoftwareReset(uint16_t reason, uint32_t pc) { wdt_restart(WDT); // kick the watchdog if (reason == (uint16_t)SoftwareResetReason::erase) @@ -1240,6 +1274,9 @@ void Platform::SoftwareReset(uint16_t reason) srdBuf[slot].magic = SoftwareResetData::magicValue; srdBuf[slot].resetReason = reason; GetStackUsage(NULL, NULL, &srdBuf[slot].neverUsedRam); + srdBuf[slot].hfsr = SCB->HFSR; + srdBuf[slot].cfsr = SCB->CFSR; + srdBuf[slot].pc = pc; // Save diagnostics data to Flash #ifdef DUET_NG @@ -1248,13 +1285,13 @@ void Platform::SoftwareReset(uint16_t reason) DueFlashStorage::write(SoftwareResetData::nvAddress, srdBuf, sizeof(srdBuf)); #endif } + + RSTC->RSTC_MR = RSTC_MR_KEY_PASSWD; // ignore any signal on the NRST pin for now so that the reset reason will show as Software Reset(); for(;;) {} } - //***************************************************************************************************************** - // Interrupts #ifndef DUET_NG @@ -1401,10 +1438,11 @@ void Platform::Diagnostics(MessageType mtype) } } - Message(mtype, "Last software reset code: "); + Message(mtype, "Last software reset code "); if (slot >= 0 && srdBuf[slot].magic == SoftwareResetData::magicValue) { - MessageF(mtype, "0x%04x, available RAM %u bytes (slot %d)\n", srdBuf[slot].resetReason, srdBuf[slot].neverUsedRam, slot); + MessageF(mtype, "0x%04x, PC 0x%08x, HFSR 0x%08x, CFSR 0x%08x, available RAM %u bytes (slot %d)\n", + srdBuf[slot].resetReason, srdBuf[slot].pc, srdBuf[slot].hfsr, srdBuf[slot].cfsr, srdBuf[slot].neverUsedRam, slot); MessageF(mtype, "Spinning module during software reset: %s\n", moduleName[srdBuf[slot].resetReason & 0x0F]); } else @@ -1512,6 +1550,8 @@ void Platform::Diagnostics(MessageType mtype) void Platform::DiagnosticTest(int d) { + static const uint32_t dummy[2] = { 0, 0 }; + switch (d) { case (int)DiagnosticTestType::TestWatchdog: @@ -1526,6 +1566,15 @@ void Platform::DiagnosticTest(int d) debugPrintf("Diagnostic Test\n"); break; + case (int)DiagnosticTestType::DivideByZero: // do an integer divide by zero to test exception handling + (void)RepRap::DoDivide(1, 0); // call function in another module so it can't be optimised away + break; + + case (int)DiagnosticTestType::UnalignedMemoryAccess: // do an unaligned memory access to test exception handling + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; // by default, unaligned memory accesses are allowed, so change that + (void)RepRap::ReadDword(reinterpret_cast(dummy) + 1); // call function in another module so it can't be optimised away + break; + case (int)DiagnosticTestType::PrintMoves: DDA::PrintMoves(); break; diff --git a/src/Platform.h b/src/Platform.h index 220af4b..f887f90 100644 --- a/src/Platform.h +++ b/src/Platform.h @@ -160,9 +160,6 @@ enum class SoftwareResetReason : uint16_t erase = 0x10, // special M999 command to erase firmware and reset NMI = 0x20, hardFault = 0x30, - memManage = 0x40, - busFault = 0x50, - usageFault = 0x60, otherFault = 0x70, inAuxOutput = 0x0800, // this bit is or'ed in if we were in aux output at the time stuckInSpin = 0x1000, // we got stuck in a Spin() function for too long @@ -176,6 +173,9 @@ enum class DiagnosticTestType : int TestWatchdog = 1001, // test that we get a watchdog reset if the tick interrupt stops TestSpinLockup = 1002, // test that we get a software reset if a Spin() function takes too long TestSerialBlock = 1003, // test what happens when we write a blocking message via debugPrintf() + DivideByZero = 1004, // do an integer divide by zero to test exception handling + UnalignedMemoryAccess = 1005, // do an unaligned memory access to test exception handling + PrintMoves = 100, // print summary of recent moves #ifdef DUET_NG PrintExpanderStatus = 101, // print DueXn expander status @@ -326,7 +326,7 @@ public: void ClassReport(float &lastTime); // Called on Spin() return to check everything's live. void LogError(ErrorCode e) { errorCodeBits |= (uint32_t)e; } - void SoftwareReset(uint16_t reason); + void SoftwareReset(uint16_t reason, uint32_t pc = 0); bool AtxPower() const; void SetAtxPower(bool on); void SetBoardType(BoardType bt); @@ -606,10 +606,10 @@ private: // The SAM4E has a large page erase size (8K). For this reason we store the software reset data in the 512-byte user signature area // instead, which doesn't get cleared when the Erase button is pressed. The SoftareResetData struct must have at least one 32-bit // field to guarantee that values of this type will be 32-bit aligned. It must have no virtual members because it is read/written - // directly form/to flash memory. + // directly from/to flash memory. struct SoftwareResetData { - static const uint16_t versionValue = 2; // increment this whenever this struct changes + static const uint16_t versionValue = 4; // increment this whenever this struct changes static const uint16_t magicValue = 0x7D00 | versionValue; // value we use to recognise that all the flash data has been written static const uint32_t nvAddress = 0; // must be 4-byte aligned static const size_t numberOfSlots = 8; // number of storage slots used to implement wear levelling @@ -617,10 +617,14 @@ private: uint16_t magic; // the magic number, including the version uint16_t resetReason; // this records why we did a software reset, for diagnostic purposes uint32_t neverUsedRam; // the amount of never used RAM at the last abnormal software reset + uint32_t hfsr; // hard fault status register + uint32_t cfsr; // configurable fault status register + uint32_t pc; // program counter when the exception occurred bool isVacant() const // return true if this struct can be written without erasing it first { - return magic == 0xFFFF && resetReason == 0xFFFF && neverUsedRam == 0xFFFFFFFF; + return magic == 0xFFFF && resetReason == 0xFFFF && neverUsedRam == 0xFFFFFFFF + && hfsr == 0xFFFFFFFF && cfsr == 0xFFFFFFFF && pc == 0xFFFFFFFF; } }; diff --git a/src/Reprap.cpp b/src/Reprap.cpp index 5af3de3..76cb970 100644 --- a/src/Reprap.cpp +++ b/src/Reprap.cpp @@ -1576,4 +1576,16 @@ uint32_t RepRap::GetCurrentXAxes() const return (currentTool == nullptr) ? DefaultXAxisMapping : currentTool->GetXAxisMap(); } +// Helper function for diagnostic tests in Platform.cpp, to cause a deliberate divide-by-zero +/*static*/ uint32_t RepRap::DoDivide(uint32_t a, uint32_t b) +{ + return a/b; +} + +// Helper function for diagnostic tests in Platform.cpp, to cause a deliberate unaligned memory read +/*static*/ uint32_t RepRap::ReadDword(const char* p) +{ + return *reinterpret_cast(p); +} + // End diff --git a/src/Reprap.h b/src/Reprap.h index 7d63152..194d869 100644 --- a/src/Reprap.h +++ b/src/Reprap.h @@ -99,6 +99,8 @@ public: void SetMessage(const char *msg); static void CopyParameterText(const char* src, char *dst, size_t length); + static uint32_t DoDivide(uint32_t a, uint32_t b); // helper function for diagnostic tests + static uint32_t ReadDword(const char* p); // helper function for diagnostic tests private: diff --git a/src/Version.h b/src/Version.h index 5064b96..32afea0 100644 --- a/src/Version.h +++ b/src/Version.h @@ -9,11 +9,11 @@ #define SRC_VERSION_H_ #ifndef VERSION -# define VERSION "1.17c+1" +# define VERSION "1.17c+2" #endif #ifndef DATE -# define DATE "2017-01-20" +# define DATE "2017-01-24" #endif #define AUTHORS "reprappro, dc42, chrishamm, t3p3, dnewman"