Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of qp_dpp by
Diff: bsp.cpp
- Revision:
- 4:6189d844a1a2
- Parent:
- 3:81ceb3127876
- Child:
- 7:80bbc7a6c78c
--- a/bsp.cpp Mon Sep 26 02:21:01 2011 +0000
+++ b/bsp.cpp Tue Sep 04 22:41:20 2012 +0000
@@ -1,265 +1,340 @@
-//////////////////////////////////////////////////////////////////////////////
-// Product: BSP for "Dining Philosophers Problem" example, QK kernel
-// Last Updated for Version: 4.2.04
-// Date of the Last Update: Sep 25, 2011
-//
-// Q u a n t u m L e a P s
-// ---------------------------
-// innovating embedded systems
-//
-// Copyright (C) 2002-2011 Quantum Leaps, LLC. All rights reserved.
-//
-// This software may be distributed and modified under the terms of the GNU
-// General Public License version 2 (GPL) as published by the Free Software
-// Foundation and appearing in the file GPL.TXT included in the packaging of
-// this file. Please note that GPL Section 2[b] requires that all works based
-// on this software must also be made publicly available under the terms of
-// the GPL ("Copyleft").
-//
-// Alternatively, this software may be distributed and modified under the
-// terms of Quantum Leaps commercial licenses, which expressly supersede
-// the GPL and are specifically designed for licensees interested in
-// retaining the proprietary status of their code.
-//
-// Contact information:
-// Quantum Leaps Web site: http://www.quantum-leaps.com
-// e-mail: info@quantum-leaps.com
-//////////////////////////////////////////////////////////////////////////////
-#include "qp_port.h"
-#include "dpp.h"
-#include "bsp.h"
-#include "LPC17xx.h"
-
-Q_DEFINE_THIS_FILE
-
-// Local-scope objects -------------------------------------------------------
-enum ISR_Priorities { // ISR priorities starting from the highest urgency
- GPIOPORTA_PRIO,
- SYSTICK_PRIO,
- // ...
-};
-
-#define LED_PORT LPC_GPIO1
-#define LED1_BIT (1U << 18)
-#define LED2_BIT (1U << 20)
-#define LED3_BIT (1U << 21)
-#define LED4_BIT (1U << 23)
-
-#ifdef Q_SPY
- #include "mbed.h" // mbed is used only for the built-in serial
-
- QSTimeCtr l_tickTime;
- QSTimeCtr l_tickPeriod;
- static uint8_t l_SysTick_Handler;
-
- #define QSPY_BAUD_RATE 115200
-
- enum AppRecords { // application-specific trace records
- PHILO_STAT = QS_USER
- };
-
- Serial l_qspy(USBTX, USBRX);
-#endif
-
-//............................................................................
-extern "C" void SysTick_Handler(void) {
- QK_ISR_ENTRY(); // inform the QK kernel of entering the ISR
-
-#ifdef Q_SPY
- uint32_t volatile dummy = SysTick->CTRL; // clear the COUNTFLAG in SysTick
- l_tickTime += l_tickPeriod; // account for the clock rollover
-#endif
-
- QF::TICK(&l_SysTick_Handler); // process all armed time events
-
- QK_ISR_EXIT(); // inform the QK kernel of exiting the ISR
-}
-
-//............................................................................
-void BSP_init(void) {
- SystemInit(); // initialize the clocking system
-
- // set LED port to output
- LED_PORT->FIODIR |= (LED1_BIT | LED2_BIT | LED3_BIT | LED4_BIT);
-
- // clear the LEDs
- LED_PORT->FIOCLR = (LED1_BIT | LED2_BIT | LED3_BIT | LED4_BIT);
-
- if (QS_INIT((void *)0) == 0) { // initialize the QS software tracing
- Q_ERROR();
- }
- QS_OBJ_DICTIONARY(&l_SysTick_Handler);
-}
-//............................................................................
-void BSP_displyPhilStat(uint8_t n, char const *stat) {
- // represent LEDs in a const array for convenience
- static uint32_t const led[] = { LED1_BIT, LED2_BIT, LED3_BIT, LED4_BIT };
- if (n < 3) {
- if (stat[0] == 'e') {
- LED_PORT->FIOSET = led[n];
- }
- else {
- LED_PORT->FIOCLR = led[n];
- }
- }
-
- QS_BEGIN(PHILO_STAT, AO_Philo[n]) // application-specific record begin
- QS_U8(1, n); // Philosopher number
- QS_STR(stat); // Philosopher status
- QS_END()
-}
-//............................................................................
-void BSP_busyDelay(void) {
- uint32_t volatile i = 10;
- while (i-- > 0UL) { // busy-wait loop
- }
-}
-
-//............................................................................
-void QF::onStartup(void) {
- // set up the SysTick timer to fire at BSP_TICKS_PER_SEC rate
- SysTick_Config(SystemCoreClock / BSP_TICKS_PER_SEC);
-
- // set priorities of all interrupts in the system...
- NVIC_SetPriority(SysTick_IRQn, SYSTICK_PRIO);
- NVIC_SetPriority(EINT0_IRQn, GPIOPORTA_PRIO);
-
- NVIC_EnableIRQ(EINT0_IRQn);
-}
-//............................................................................
-void QF::onCleanup(void) {
-}
-//............................................................................
-void QK::onIdle(void) {
-
- QF_INT_LOCK(dummy);
- LED_PORT->FIOSET = LED4_BIT; // turn the LED4 on
- __NOP(); // delay a bit to see some light intensity
- __NOP();
- __NOP();
- __NOP();
- LED_PORT->FIOCLR = LED4_BIT; // turn the LED4 off
- QF_INT_UNLOCK(dummy);
-
-#ifdef Q_SPY
- if (l_qspy.writeable()) {
- QF_INT_LOCK(dummy);
- uint16_t b = QS::getByte();
- QF_INT_UNLOCK(dummy);
- if (b != QS_EOD) {
- l_qspy.putc((uint8_t)b);
- }
- }
-#else
- // Put the CPU and peripherals to the low-power mode. You might need to
- // customize the clock management for your application, see the datasheet
- // for your particular Cortex-M3 MCU.
- //
- // Specifially for the mbed board, see the articles:
- // * "Power Management" http://mbed.org/cookbook/Power-Management; and
- // * "Interface Powerdown" at
- // http://mbed.org/users/simon/notebook/interface-powerdown/
- //
- __WFI();
-#endif
-}
-
-//............................................................................
-void Q_onAssert(char const Q_ROM * const Q_ROM_VAR file, int line) {
- (void)file; // avoid compiler warning
- (void)line; // avoid compiler warning
- QF_INT_LOCK(dummy); // make sure that all interrupts are disabled
- // light up all LEDs
- LED_PORT->FIOSET = (LED1_BIT | LED2_BIT | LED3_BIT | LED4_BIT);
-
- for (;;) { // NOTE: replace the loop with reset for final version
- }
-}
-
-//----------------------------------------------------------------------------
-#ifdef Q_SPY
-//............................................................................
-uint8_t QS::onStartup(void const *arg) {
- static uint8_t qsBuf[6*256]; // buffer for Quantum Spy
- initBuf(qsBuf, sizeof(qsBuf));
-
- l_qspy.baud(QSPY_BAUD_RATE);
-
- l_tickPeriod = SystemCoreClock / BSP_TICKS_PER_SEC;
- l_tickTime = l_tickPeriod; // to start the timestamp at zero
-
- // setup the QS filters...
- QS_FILTER_ON(QS_ALL_RECORDS);
-
-// QS_FILTER_OFF(QS_QEP_STATE_EMPTY);
-// QS_FILTER_OFF(QS_QEP_STATE_ENTRY);
-// QS_FILTER_OFF(QS_QEP_STATE_EXIT);
-// QS_FILTER_OFF(QS_QEP_STATE_INIT);
-// QS_FILTER_OFF(QS_QEP_INIT_TRAN);
-// QS_FILTER_OFF(QS_QEP_INTERN_TRAN);
-// QS_FILTER_OFF(QS_QEP_TRAN);
-// QS_FILTER_OFF(QS_QEP_IGNORED);
-
- QS_FILTER_OFF(QS_QF_ACTIVE_ADD);
- QS_FILTER_OFF(QS_QF_ACTIVE_REMOVE);
- QS_FILTER_OFF(QS_QF_ACTIVE_SUBSCRIBE);
- QS_FILTER_OFF(QS_QF_ACTIVE_UNSUBSCRIBE);
- QS_FILTER_OFF(QS_QF_ACTIVE_POST_FIFO);
- QS_FILTER_OFF(QS_QF_ACTIVE_POST_LIFO);
- QS_FILTER_OFF(QS_QF_ACTIVE_GET);
- QS_FILTER_OFF(QS_QF_ACTIVE_GET_LAST);
- QS_FILTER_OFF(QS_QF_EQUEUE_INIT);
- QS_FILTER_OFF(QS_QF_EQUEUE_POST_FIFO);
- QS_FILTER_OFF(QS_QF_EQUEUE_POST_LIFO);
- QS_FILTER_OFF(QS_QF_EQUEUE_GET);
- QS_FILTER_OFF(QS_QF_EQUEUE_GET_LAST);
- QS_FILTER_OFF(QS_QF_MPOOL_INIT);
- QS_FILTER_OFF(QS_QF_MPOOL_GET);
- QS_FILTER_OFF(QS_QF_MPOOL_PUT);
- QS_FILTER_OFF(QS_QF_PUBLISH);
- QS_FILTER_OFF(QS_QF_NEW);
- QS_FILTER_OFF(QS_QF_GC_ATTEMPT);
- QS_FILTER_OFF(QS_QF_GC);
-// QS_FILTER_OFF(QS_QF_TICK);
- QS_FILTER_OFF(QS_QF_TIMEEVT_ARM);
- QS_FILTER_OFF(QS_QF_TIMEEVT_AUTO_DISARM);
- QS_FILTER_OFF(QS_QF_TIMEEVT_DISARM_ATTEMPT);
- QS_FILTER_OFF(QS_QF_TIMEEVT_DISARM);
- QS_FILTER_OFF(QS_QF_TIMEEVT_REARM);
- QS_FILTER_OFF(QS_QF_TIMEEVT_POST);
- QS_FILTER_OFF(QS_QF_INT_LOCK);
- QS_FILTER_OFF(QS_QF_INT_UNLOCK);
- QS_FILTER_OFF(QS_QF_ISR_ENTRY);
- QS_FILTER_OFF(QS_QF_ISR_EXIT);
-
-// QS_FILTER_OFF(QS_QK_MUTEX_LOCK);
-// QS_FILTER_OFF(QS_QK_MUTEX_UNLOCK);
-// QS_FILTER_OFF(QS_QK_SCHEDULE);
-
- return (uint8_t)1; // return success
-}
-//............................................................................
-void QS::onCleanup(void) {
-}
-//............................................................................
-QSTimeCtr QS::onGetTime(void) { // invoked with interrupts locked
- if ((SysTick->CTRL & 0x00000100) == 0) { // COUNTFLAG no set?
- return l_tickTime - (QSTimeCtr)SysTick->VAL;
- }
- else { // the rollover occured, but the SysTick_ISR did not run yet
- return l_tickTime + l_tickPeriod - (QSTimeCtr)SysTick->VAL;
- }
-}
-//............................................................................
-void QS::onFlush(void) {
- uint16_t b;
- QF_INT_LOCK(dummy);
- while ((b = QS::getByte()) != QS_EOD) {
- while (!l_qspy.writeable()) { // wait until serial port is writable
- }
- l_qspy.putc((uint8_t)b);
- }
- QF_INT_UNLOCK(dummy);
-}
-#endif // Q_SPY
-//----------------------------------------------------------------------------
+//////////////////////////////////////////////////////////////////////////////
+// Product: DPP example, configurable Vanilla/QK kernel
+// Last Updated for Version: 4.5.02
+// Date of the Last Update: Sep 04, 2012
+//
+// Q u a n t u m L e a P s
+// ---------------------------
+// innovating embedded systems
+//
+// Copyright (C) 2002-2012 Quantum Leaps, LLC. All rights reserved.
+//
+// This program is open source 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 2 of the License, or
+// (at your option) any later version.
+//
+// Alternatively, this program may be distributed and modified under the
+// terms of Quantum Leaps commercial licenses, which expressly supersede
+// the GNU General Public License and are specifically designed for
+// licensees interested in retaining the proprietary status of their code.
+//
+// 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/>.
+//
+// Contact information:
+// Quantum Leaps Web sites: http://www.quantum-leaps.com
+// http://www.state-machine.com
+// e-mail: info@quantum-leaps.com
+//////////////////////////////////////////////////////////////////////////////
+#include "qp_port.h"
+#include "dpp.h"
+#include "bsp.h"
+#include "LPC17xx.h"
+#ifdef Q_SPY
+ #include "mbed.h" // mbed is used only for the built-in serial
+#endif
+
+//////////////////////////////////////////////////////////////////////////////
+namespace DPP {
+
+Q_DEFINE_THIS_FILE
+
+enum ISR_Priorities { // ISR priorities starting from the highest urgency
+ GPIOPORTA_PRIO,
+ SYSTICK_PRIO
+ // ...
+};
+
+// Local-scope objects -------------------------------------------------------
+static uint32_t l_rnd; // random seed
+
+#define LED_PORT LPC_GPIO1
+#define LED1_BIT (1U << 18)
+#define LED2_BIT (1U << 20)
+#define LED3_BIT (1U << 21)
+#define LED4_BIT (1U << 23)
+
+#ifdef Q_SPY
+ QP::QSTimeCtr l_tickTime;
+ QP::QSTimeCtr l_tickPeriod;
+ static uint8_t l_SysTick_Handler;
+
+ #define QSPY_BAUD_RATE 115200U
+
+ enum AppRecords { // application-specific trace records
+ PHILO_STAT = QP::QS_USER
+ };
+
+ Serial l_qspy(USBTX, USBRX);
+#endif
+
+//............................................................................
+extern "C" void SysTick_Handler(void) {
+ QK_ISR_ENTRY(); // inform the QK kernel of entering the ISR
+
+#ifdef Q_SPY
+ uint32_t volatile dummy = SysTick->CTRL; // clear the COUNTFLAG in SysTick
+ l_tickTime += l_tickPeriod; // account for the clock rollover
+#endif
+
+ QP::QF::TICK(&l_SysTick_Handler); // process all armed time events
+
+ QK_ISR_EXIT(); // inform the QK kernel of exiting the ISR
+}
+
+//............................................................................
+void BSP_init(void) {
+ // set the system clock as specified in lm3s_config.h (20MHz from PLL)
+ SystemInit();
+
+ // set LED port to output
+ LED_PORT->FIODIR |= (LED1_BIT | LED2_BIT | LED3_BIT | LED4_BIT);
+
+ // clear the LEDs
+ LED_PORT->FIOCLR = (LED1_BIT | LED2_BIT | LED3_BIT | LED4_BIT);
+
+ // initialize the QS software tracing...
+ Q_ALLEGE(QS_INIT(static_cast<void *>(0)));
+ QS_RESET();
+ QS_OBJ_DICTIONARY(&l_SysTick_Handler);
+}
+//............................................................................
+void BSP_terminate(int16_t const result) {
+ (void)result;
+}
+//............................................................................
+void BSP_displayPhilStat(uint8_t const n, char_t const * const stat) {
+ // represent LEDs in a const array for convenience
+ static uint32_t const led[] = { LED1_BIT, LED2_BIT, LED3_BIT, LED4_BIT };
+ if (n < 3) {
+ if (stat[0] == 'e') {
+ LED_PORT->FIOSET = led[n];
+ }
+ else {
+ LED_PORT->FIOCLR = led[n];
+ }
+ }
+
+ QS_BEGIN(PHILO_STAT, AO_Philo[n]) // application-specific record begin
+ QS_U8(1U, n); // Philosopher number
+ QS_STR(stat); // Philosopher status
+ QS_END()
+}
+//............................................................................
+void BSP_displayPaused(uint8_t const paused) {
+ (void)paused;
+}
+//............................................................................
+uint32_t BSP_random(void) { // a very cheap pseudo-random-number generator
+ // "Super-Duper" Linear Congruential Generator (LCG)
+ // LCG(2^32, 3*7*11*13*23, 0, seed)
+ //
+ l_rnd = l_rnd * (3U*7U*11U*13U*23U);
+ return l_rnd >> 8;
+}
+//............................................................................
+void BSP_randomSeed(uint32_t const seed) {
+ l_rnd = seed;
+}
+
+//............................................................................
+extern "C" void Q_onAssert(char_t const * const file, int_t const line) {
+ (void)file; // avoid compiler warning
+ (void)line; // avoid compiler warning
+ QF_INT_DISABLE(); // make sure that all interrupts are disabled
+ // light up all LEDs
+ LED_PORT->FIOSET = (LED1_BIT | LED2_BIT | LED3_BIT | LED4_BIT);
+
+ for (;;) { // NOTE: replace the loop with reset for final version
+ }
+}
+
+} // namespace DPP
+//////////////////////////////////////////////////////////////////////////////
+
+namespace QP {
+
+//............................................................................
+void QF::onStartup(void) {
+ // set up the SysTick timer to fire at BSP_TICKS_PER_SEC rate
+ (void)SysTick_Config(SystemCoreClock / DPP::BSP_TICKS_PER_SEC);
+
+ // set priorities of all interrupts in the system...
+ NVIC_SetPriority(SysTick_IRQn, DPP::SYSTICK_PRIO);
+ NVIC_SetPriority(EINT0_IRQn, DPP::GPIOPORTA_PRIO);
+
+ NVIC_EnableIRQ(EINT0_IRQn);
+}
+//............................................................................
+void QF::onCleanup(void) {
+}
+//............................................................................
+#ifdef QK_PREEMPTIVE
+
+void QK::onIdle(void) {
+
+ QF_INT_DISABLE();
+ LED_PORT->FIOSET = LED4_BIT; // turn the LED4 on
+ __NOP(); // delay a bit to see some light intensity
+ __NOP();
+ __NOP();
+ __NOP();
+ LED_PORT->FIOCLR = LED4_BIT; // turn the LED4 off
+ QF_INT_ENABLE();
+
+#ifdef Q_SPY
+ if (DPP::l_qspy.writeable()) {
+
+ QF_INT_DISABLE();
+ uint16_t b = QS::getByte();
+ QF_INT_ENABLE();
+
+ if (b != QS_EOD) {
+ DPP::l_qspy.putc((uint8_t)b);
+ }
+ }
+#else
+ // Put the CPU and peripherals to the low-power mode. You might need to
+ // customize the clock management for your application, see the datasheet
+ // for your particular Cortex-M3 MCU.
+ //
+ // Specifially for the mbed board, see the articles:
+ // * "Power Management" http://mbed.org/cookbook/Power-Management; and
+ // * "Interface Powerdown" at
+ // http://mbed.org/users/simon/notebook/interface-powerdown/
+ //
+ __WFI();
+#endif
+}
+
+#else // non-preemptive Vanilla kernel
+
+void QF::onIdle(void) { // NOTE: called with interrupts DISABLED
+
+ LED_PORT->FIOSET = LED4_BIT; // turn the LED4 on
+ __NOP(); // delay a bit to see some light intensity
+ __NOP();
+ __NOP();
+ __NOP();
+ LED_PORT->FIOCLR = LED4_BIT; // turn the LED4 off
+
+#ifdef Q_SPY
+ QF_INT_ENABLE();
+ if (DPP::l_qspy.writeable()) {
+
+ QF_INT_DISABLE();
+ uint16_t b = QS::getByte();
+ QF_INT_ENABLE();
+
+ if (b != QS_EOD) {
+ DPP::l_qspy.putc((uint8_t)b);
+ }
+ }
+#else
+ // Put the CPU and peripherals to the low-power mode. You might need to
+ // customize the clock management for your application, see the datasheet
+ // for your particular Cortex-M3 MCU.
+ //
+ // Specifially for the mbed board, see the articles:
+ // * "Power Management" http://mbed.org/cookbook/Power-Management; and
+ // * "Interface Powerdown" at
+ // http://mbed.org/users/simon/notebook/interface-powerdown/
+ //
+ __WFI();
+ QF_INT_ENABLE();
+#endif
+}
+
+#endif // QK_PREEMPTIVE
+
+//----------------------------------------------------------------------------
+#ifdef Q_SPY
+//............................................................................
+bool QS::onStartup(void const *arg) {
+ static uint8_t qsBuf[6*256]; // buffer for Quantum Spy
+ initBuf(qsBuf, sizeof(qsBuf));
+
+ DPP::l_qspy.baud(QSPY_BAUD_RATE);
+
+ DPP::l_tickPeriod = SystemCoreClock / DPP::BSP_TICKS_PER_SEC;
+ DPP::l_tickTime = DPP::l_tickPeriod; // to start the timestamp at zero
+
+ // setup the QS filters...
+ QS_FILTER_ON(QS_ALL_RECORDS);
+
+// QS_FILTER_OFF(QS_QEP_STATE_EMPTY);
+// QS_FILTER_OFF(QS_QEP_STATE_ENTRY);
+// QS_FILTER_OFF(QS_QEP_STATE_EXIT);
+// QS_FILTER_OFF(QS_QEP_STATE_INIT);
+// QS_FILTER_OFF(QS_QEP_INIT_TRAN);
+// QS_FILTER_OFF(QS_QEP_INTERN_TRAN);
+// QS_FILTER_OFF(QS_QEP_TRAN);
+// QS_FILTER_OFF(QS_QEP_IGNORED);
+
+// QS_FILTER_OFF(QS_QF_ACTIVE_ADD);
+// QS_FILTER_OFF(QS_QF_ACTIVE_REMOVE);
+// QS_FILTER_OFF(QS_QF_ACTIVE_SUBSCRIBE);
+// QS_FILTER_OFF(QS_QF_ACTIVE_UNSUBSCRIBE);
+// QS_FILTER_OFF(QS_QF_ACTIVE_POST_FIFO);
+// QS_FILTER_OFF(QS_QF_ACTIVE_POST_LIFO);
+// QS_FILTER_OFF(QS_QF_ACTIVE_GET);
+// QS_FILTER_OFF(QS_QF_ACTIVE_GET_LAST);
+// QS_FILTER_OFF(QS_QF_EQUEUE_INIT);
+// QS_FILTER_OFF(QS_QF_EQUEUE_POST_FIFO);
+// QS_FILTER_OFF(QS_QF_EQUEUE_POST_LIFO);
+// QS_FILTER_OFF(QS_QF_EQUEUE_GET);
+// QS_FILTER_OFF(QS_QF_EQUEUE_GET_LAST);
+// QS_FILTER_OFF(QS_QF_MPOOL_INIT);
+// QS_FILTER_OFF(QS_QF_MPOOL_GET);
+// QS_FILTER_OFF(QS_QF_MPOOL_PUT);
+// QS_FILTER_OFF(QS_QF_PUBLISH);
+// QS_FILTER_OFF(QS_QF_NEW);
+// QS_FILTER_OFF(QS_QF_GC_ATTEMPT);
+// QS_FILTER_OFF(QS_QF_GC);
+// QS_FILTER_OFF(QS_QF_TICK);
+// QS_FILTER_OFF(QS_QF_TIMEEVT_ARM);
+// QS_FILTER_OFF(QS_QF_TIMEEVT_AUTO_DISARM);
+// QS_FILTER_OFF(QS_QF_TIMEEVT_DISARM_ATTEMPT);
+// QS_FILTER_OFF(QS_QF_TIMEEVT_DISARM);
+// QS_FILTER_OFF(QS_QF_TIMEEVT_REARM);
+// QS_FILTER_OFF(QS_QF_TIMEEVT_POST);
+ QS_FILTER_OFF(QS_QF_CRIT_ENTRY);
+ QS_FILTER_OFF(QS_QF_CRIT_EXIT);
+ QS_FILTER_OFF(QS_QF_ISR_ENTRY);
+ QS_FILTER_OFF(QS_QF_ISR_EXIT);
+
+ return true; // return success
+}
+//............................................................................
+void QS::onCleanup(void) {
+}
+//............................................................................
+QSTimeCtr QS::onGetTime(void) { // invoked with interrupts locked
+ if ((SysTick->CTRL & 0x00000100U) == 0U) { // COUNTFLAG no set?
+ return DPP::l_tickTime - (QSTimeCtr)SysTick->VAL;
+ }
+ else { // the rollover occured, but the SysTick_ISR did not run yet
+ return DPP::l_tickTime + DPP::l_tickPeriod - (QSTimeCtr)SysTick->VAL;
+ }
+}
+//............................................................................
+void QS::onFlush(void) {
+ uint16_t b;
+ QF_INT_DISABLE();
+ while ((b = QS::getByte()) != QS_EOD) {
+ while (!DPP::l_qspy.writeable()) { // wait until serial is writable
+ }
+ DPP::l_qspy.putc((uint8_t)b);
+ }
+ QF_INT_ENABLE();
+}
+#endif // Q_SPY
+//----------------------------------------------------------------------------
+
+} // namespace QP
