From 4cdb28e10df681a7cccc2ec9ae4d508ae38fe402 Mon Sep 17 00:00:00 2001 From: MMS Date: Fri, 12 Aug 2022 15:24:06 -0400 Subject: [PATCH] 7.0.2 improved Zephyr port and examples --- doxygen/Doxyfile | 2 +- doxygen/images/qp-zephyr.jpg | Bin 0 -> 24318 bytes examples/zephyr/dpp/README.md | 2 +- examples/zephyr/dpp/prj.conf | 10 ++- examples/zephyr/dpp/src/bsp.cpp | 122 ++++++++++++++++---------------- zephyr/CMakeLists.txt | 5 +- zephyr/Kconfig | 6 -- zephyr/README.md | 34 ++++++--- zephyr/qf_port.cpp | 15 +++- zephyr/qf_port.hpp | 12 +++- 10 files changed, 119 insertions(+), 89 deletions(-) create mode 100644 doxygen/images/qp-zephyr.jpg diff --git a/doxygen/Doxyfile b/doxygen/Doxyfile index 5acb2687..613fb450 100644 --- a/doxygen/Doxyfile +++ b/doxygen/Doxyfile @@ -7,7 +7,7 @@ #--------------------------------------------------------------------------- DOXYFILE_ENCODING = UTF-8 PROJECT_NAME = "QP/C++" -PROJECT_NUMBER = 7.0.1 +PROJECT_NUMBER = 7.0.2 PROJECT_BRIEF = "Real-Time Embedded Framework" PROJECT_LOGO = ../../ql-doxygen/images/logo_ql.png OUTPUT_DIRECTORY = diff --git a/doxygen/images/qp-zephyr.jpg b/doxygen/images/qp-zephyr.jpg new file mode 100644 index 0000000000000000000000000000000000000000..16ef9346cc5de41422aa48ffc518d8f755b93d60 GIT binary patch literal 24318 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

!{Q{8!b> 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 I{Lk5c04W-XivR!s literal 0 HcmV?d00001 diff --git a/examples/zephyr/dpp/README.md b/examples/zephyr/dpp/README.md index 0602a008..9fb09751 100644 --- a/examples/zephyr/dpp/README.md +++ b/examples/zephyr/dpp/README.md @@ -34,7 +34,7 @@ The [QP/Spy software tracing](https://www.state-machine.com/qtools/qpspy.html) is supported in this example and can be enabled by providing the command-line option `-DQSPY=ON` to the build process: -Specific example +Specific example ``` west build -b nucleo_h743zi -- -DQSPY=ON ``` diff --git a/examples/zephyr/dpp/prj.conf b/examples/zephyr/dpp/prj.conf index 441f6b5c..b55132ff 100644 --- a/examples/zephyr/dpp/prj.conf +++ b/examples/zephyr/dpp/prj.conf @@ -1,8 +1,12 @@ +# QPCPP Zephyr application +# SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-QL-commercial + +CONFIG_QPCPP=y CONFIG_CPLUSPLUS=y -CONFIG_ASSERT=y -CONFIG_ASSERT_LEVEL=2 CONFIG_NUM_COOP_PRIORITIES=29 CONFIG_NUM_PREEMPT_PRIORITIES=40 -CONFIG_GPIO=y CONFIG_REBOOT=y +# for QSPY... +CONFIG_SERIAL=y +CONFIG_UART_INTERRUPT_DRIVEN=y diff --git a/examples/zephyr/dpp/src/bsp.cpp b/examples/zephyr/dpp/src/bsp.cpp index f7a907f5..4ae3f9f2 100644 --- a/examples/zephyr/dpp/src/bsp.cpp +++ b/examples/zephyr/dpp/src/bsp.cpp @@ -22,8 +22,8 @@ // // //============================================================================ -//! @date Last updated on: 2022-08-05 -//! @version Last updated for: @ref qpcpp_7_0_1 +//! @date Last updated on: 2022-08-12 +//! @version Last updated for: @ref qpcpp_7_0_2 //! //! @file //! @brief DPP example (BSP) @@ -68,7 +68,7 @@ static struct k_timer QF_tick_timer; PHILO_STAT = QP::QS_USER, PAUSED_STAT, COMMAND_STAT, - CONTEXT_SW + TEST_MSG }; #endif @@ -103,22 +103,20 @@ void BSP::init(void) { // object dictionaries... QS_OBJ_DICTIONARY(AO_Table); - QS_OBJ_DICTIONARY(AO_Philo[0]); - QS_OBJ_DICTIONARY(AO_Philo[1]); - QS_OBJ_DICTIONARY(AO_Philo[2]); - QS_OBJ_DICTIONARY(AO_Philo[3]); - QS_OBJ_DICTIONARY(AO_Philo[4]); - QS_OBJ_DICTIONARY(&timerID); + for (int n = 0; n < N_PHILO; ++n) { + QS_OBJ_ARR_DICTIONARY(AO_Philo[n], n); + } QS_USR_DICTIONARY(PHILO_STAT); QS_USR_DICTIONARY(PAUSED_STAT); QS_USR_DICTIONARY(COMMAND_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); + QS_USR_DICTIONARY(TEST_MSG); // setup the QS filters... QS_GLB_FILTER(QP::QS_SM_RECORDS); // state machine records QS_GLB_FILTER(QP::QS_AO_RECORDS); // active object records QS_GLB_FILTER(QP::QS_UA_RECORDS); // all user records + QS_GLB_FILTER(TEST_MSG); } //............................................................................ void BSP::ledOn(void) { @@ -136,6 +134,7 @@ void BSP::displayPhilStat(uint8_t n, char const *stat) { else { ledOff(); } + Q_PRINTK("Philo[%d]->%s\n", n, stat); QS_BEGIN_ID(PHILO_STAT, AO_Philo[n]->m_prio) // app-specific record begin QS_U8(1, n); // Philosopher number @@ -144,7 +143,7 @@ void BSP::displayPhilStat(uint8_t n, char const *stat) { } //............................................................................ void BSP::displayPaused(uint8_t paused) { - static_cast(paused); // unused parameter + Q_UNUSED_PAR(paused); } //............................................................................ uint32_t BSP::random(void) { // a very cheap pseudo-random-number generator @@ -167,7 +166,7 @@ void BSP::randomSeed(uint32_t seed) { //............................................................................ void BSP::terminate(int16_t result) { - (void)result; + Q_UNUSED_PAR(result); } } // namespace DPP @@ -179,9 +178,11 @@ namespace QP { // QF callbacks ============================================================== void QF::onStartup(void) { k_timer_start(&QF_tick_timer, K_MSEC(1), K_MSEC(1)); + Q_PRINTK("QF::onStartup()"); } //............................................................................ void QF::onCleanup(void) { + Q_PRINTK("QF::onCleanup()"); } // QS callbacks ============================================================== @@ -189,52 +190,53 @@ void QF::onCleanup(void) { #include -static const struct device *uart_console_dev; +// select the Zephyr shell UART +// NOTE: you can change this to other UART peripheral if desired +static struct device const *uart_dev = + DEVICE_DT_GET(DT_CHOSEN(zephyr_shell_uart)); //............................................................................ -static K_THREAD_STACK_DEFINE(qspy_stack, 1024); // stack storage -static k_thread qspy_thread_handler; -static void qspy_thread(void *p1, void *p2, void *p3){ - while (true) { - // transmit bytes... - std::uint16_t len = 0xFFFFU; // get as many bytes as available - - QS_CRIT_STAT_ - QS_CRIT_E_(); - std::uint8_t const *buf = QS::getBlock(&len); - QS_CRIT_X_(); - for (; len != 0U; --len, ++buf) { - uart_poll_out(uart_console_dev, *buf); - } +void QS::doOutput(void) { + std::uint16_t len = 0xFFFFU; // big number to get all available bytes - // receive bytes... - std::uint8_t b; - while (uart_poll_in(uart_console_dev, &b) == 0) { - QS::rxPut(b); - } - QS::rxParse(); + QS_CRIT_STAT_ + QS_CRIT_E_(); + std::uint8_t const *buf = QS::getBlock(&len); + QS_CRIT_X_(); + + // transmit the bytes via the UART... + for (; len != 0U; --len, ++buf) { + uart_poll_out(uart_dev, *buf); } } +//............................................................................ +static void uart_cb(const struct device *dev, void *user_data) { + if (!uart_irq_update(uart_dev)) { + return; + } + if (uart_irq_rx_ready(uart_dev)) { + std::uint8_t buf[32]; + int n = uart_fifo_read(uart_dev, buf, sizeof(buf)); + for (std::uint8_t const *p = buf; n > 0; --n, ++p) { + QS::rxPut(*p); + } + } +} +//............................................................................ bool QS::onStartup(void const *arg) { static uint8_t qsTxBuf[2*1024]; // buffer for QS transmit channel static uint8_t qsRxBuf[256]; // buffer for QS receive channel + Q_REQUIRE(uart_dev != NULL); + initBuf (qsTxBuf, sizeof(qsTxBuf)); rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - uart_console_dev = DEVICE_DT_GET(DT_CHOSEN(zephyr_console)); - Q_ASSERT(uart_console_dev != NULL); - k_thread_create(&qspy_thread_handler, - qspy_stack, - K_THREAD_STACK_SIZEOF(qspy_stack), - &qspy_thread, - nullptr, // p1 - nullptr, // p2 - nullptr, // p3 - QF_MAX_ACTIVE, // lowest priority - K_ESSENTIAL, // thread options - K_NO_WAIT); // start immediately - //TODO assert if could not create thread + + // configure interrupt and callback to receive data + uart_irq_callback_user_data_set(uart_dev, &uart_cb, nullptr); + uart_irq_rx_enable(uart_dev); + return true; // return success } //............................................................................ @@ -242,19 +244,17 @@ void QS::onCleanup(void) { } //............................................................................ QSTimeCtr QS::onGetTime(void) { // NOTE: invoked with interrupts DISABLED - return k_uptime_get_32(); + return k_cycle_get_32(); } //............................................................................ void QS::onFlush(void) { - uint16_t len = 0xFFFFU; // big number to get as many bytes as available - uint8_t const *buf = QS::getBlock(&len); // get continguous block of data - while (buf != nullptr) { // data available? - for(auto i = 0;i!=len;i++) - { - uart_poll_out(uart_console_dev,buf[i]); - } - len = 0xFFFFU; // big number to get as many bytes as available - buf = QS::getBlock(&len); // try to get more data + std::uint16_t len = 0xFFFFU; // to get as many bytes as available + std::uint8_t const *buf; + while ((buf = QS::getBlock(&len)) != nullptr) { // QS-TX data available? + for (; len != 0U; --len, ++buf) { + uart_poll_out(uart_dev, *buf); + } + len = 0xFFFFU; // to get as many bytes as available } } //............................................................................ @@ -268,10 +268,10 @@ extern "C" void assert_failed(char const *module, int loc); void QS::onCommand(uint8_t cmdId, uint32_t param1, uint32_t param2, uint32_t param3) { - (void)cmdId; - (void)param1; - (void)param2; - (void)param3; + Q_UNUSED_PAR(cmdId); + Q_UNUSED_PAR(param1); + Q_UNUSED_PAR(param2); + Q_UNUSED_PAR(param3); } #endif // Q_SPY @@ -286,8 +286,8 @@ Q_NORETURN Q_onAssert(char const * const module, int_t const loc) { // // NOTE: add here your application-specific error handling // - printk("\nASSERTION in %s:%d\n", module, loc); QS_ASSERTION(module, loc, static_cast(10000U)); + Q_PRINTK("\nASSERTION in %s:%d\n", module, loc); #ifndef NDEBUG k_panic(); // debug build: halt the system for error search... diff --git a/zephyr/CMakeLists.txt b/zephyr/CMakeLists.txt index cf2995b6..04e2e636 100644 --- a/zephyr/CMakeLists.txt +++ b/zephyr/CMakeLists.txt @@ -32,7 +32,8 @@ zephyr_library_sources( ${QPCPP_DIR}/zephyr/qf_port.cpp ) -if(CONFIG_QSPY) +# QSPY option... +if(QSPY) target_compile_definitions(app PUBLIC Q_SPY) zephyr_library_compile_definitions(Q_SPY) @@ -46,6 +47,6 @@ zephyr_library_sources( ${QPCPP_DIR}/include/qstamp.cpp ) -endif() # CONFIG_QSPY +endif() # QSPY endif() # CONFIG_QPCPP diff --git a/zephyr/Kconfig b/zephyr/Kconfig index 4989808d..490543d8 100644 --- a/zephyr/Kconfig +++ b/zephyr/Kconfig @@ -9,12 +9,6 @@ menuconfig QPCPP if QPCPP -config QSPY - bool "QSPY Tracing" - default n - help - Enables the QSPY Tracing for QP - module = QPCPP module-str = QPCPP diff --git a/zephyr/README.md b/zephyr/README.md index ad3f6003..d99e4b7b 100644 --- a/zephyr/README.md +++ b/zephyr/README.md @@ -1,4 +1,6 @@ -# qpcpp Zephyr Module +[![QP Zephyr Module](../doxygen/images/qp-zephyr.jpg)](https://www.state-machine.com/qpcpp/zephyr.html) + +# About the QPCPP Zephyr Module This directory defines the [QP/C++ Real-Time Embedded Framework](https://github.com/QuantumLeaps/qpcpp) as a [Zephyr module](https://docs.zephyrproject.org/latest/develop/modules.html). @@ -7,22 +9,32 @@ as a [Zephyr module](https://docs.zephyrproject.org/latest/develop/modules.html) Example of use is provided in the related repository [qpcpp-zephyr-app](https://github.com/QuantumLeaps/qpcpp-zephyr-app) +To create your own QP-Zephyr project, you can clone that repository +and customize it to your needs: + +```bash +git clone https://github.com/QuantumLeaps/qpcpp-zephyr-app --recurse-submodules --depth 1 +``` +where `` is the name of your project. + ## Configuring the QPCPP Zephyr Module -The `Kconfig` file provides configuration `CONFIG_QPCPP` to activate -the QPCPP module in Zephyr. To do so, you need to add the following -line to your `prj.conf`: +The `Kconfig` file provides configuration `CONFIG_QPCPP` to activate the QPCPP module +in Zephyr. To do so, you need to add the following line to your `prj.conf`: ```ini CONFIG_QPCPP=y ``` -## Configuring the QSPY Software Tracing -If you wish to enable -[QSPY Software Tracing](https://www.state-machine.com/qtools/qpspy.html), -`Kconfig` file provides configuration `CONFIG_QSPY`, which you can -use in your `prj.conf`: +## Option for Activating QSPY Software Tracing +The QP/C++ Zephyr Module supports the +[QSPY Software Tracing](https://www.state-machine.com/qtools/qpspy.html) +option and will add the appropriate macros and files to build the "QSPY" +configuration. -```ini -CONFIG_QSPY=y +If you wish to enable "QSPY" you can provide the option "QSPY" +in the command-line for the build. For example: + +```bash +west build -b nucleo_h743zi -- -DQSPY=ON ``` diff --git a/zephyr/qf_port.cpp b/zephyr/qf_port.cpp index f7d639b6..a382355f 100644 --- a/zephyr/qf_port.cpp +++ b/zephyr/qf_port.cpp @@ -22,8 +22,8 @@ // // //============================================================================ -//! @date Last updated on: 2022-08-06 -//! @version Last updated for: @ref qpcpp_7_0_1 +//! @date Last updated on: 2022-08-12 +//! @version Last updated for: @ref qpcpp_7_0_2 //! //! @file //! @brief QF/C++ port to Zephyr RTOS kernel, all supported compilers @@ -67,7 +67,18 @@ void QF::init(void) { //............................................................................ int_t QF::run(void) { onStartup(); +#ifdef Q_SPY + // lower the priority of the main thread to the level of idle + k_thread_priority_set(k_current_get(), + CONFIG_NUM_PREEMPT_PRIORITIES - 1); + // perform QS work + while (true) { + QS::rxParse(); // parse any QS-RX bytes + QS::doOutput(); // perform the QS-TX output + } +#else return 0; // return from the main Zephyr thread +#endif } //............................................................................ void QF::stop(void) { diff --git a/zephyr/qf_port.hpp b/zephyr/qf_port.hpp index ca2a6798..e6fcdc6a 100644 --- a/zephyr/qf_port.hpp +++ b/zephyr/qf_port.hpp @@ -22,8 +22,8 @@ // // //============================================================================ -//! @date Last updated on: 2022-08-06 -//! @version Last updated for: @ref qpcpp_7_0_1 +//! @date Last updated on: 2022-08-12 +//! @version Last updated for: @ref qpcpp_7_0_2 //! //! @file //! @brief QF/C++ port to Zephyr RTOS kernel, all supported compilers @@ -61,6 +61,14 @@ extern struct k_spinlock spinlock; } // namespace QF } // namespace QP +// Q_PRINTK() macro to avoid conflicts with Zephyr's printk() +// when Q_SPY configuation is used +#ifndef Q_SPY +#define Q_PRINTK(fmt_, ...) printk(fmt_, ##__VA_ARGS__) +#else +#define Q_PRINTK(dummy, ...) (static_cast(0)) +#endif + //============================================================================ // interface used only inside QF, but not in applications //