From a1275ec0e73f0cdc83783a7ea634f962bd32eb02 Mon Sep 17 00:00:00 2001 From: MMS Date: Thu, 4 Jan 2024 11:32:37 -0500 Subject: [PATCH 1/2] 7.3.2 --- examples/arm-cm/dpp_nucleo-c031c6/README.md | 20 +++++++++++++++++- .../arm-cm/dpp_nucleo-c031c6/qp_arm-cm.jpg | Bin 0 -> 19322 bytes 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qp_arm-cm.jpg diff --git a/examples/arm-cm/dpp_nucleo-c031c6/README.md b/examples/arm-cm/dpp_nucleo-c031c6/README.md index 16866fc7..fe6f55ae 100644 --- a/examples/arm-cm/dpp_nucleo-c031c6/README.md +++ b/examples/arm-cm/dpp_nucleo-c031c6/README.md @@ -9,6 +9,13 @@ This example demonstrates the [Dining Philosophers Problem (DPP) application](ht STM32 NUCLEO-C031C6

+> **NOTE** +This example can be used as a starting point for any other ARM Cortex-M MCU, including those based on differnt Cortex-M cores (M0/M0+/M3/M4/M7/M23/M33/M55/M85...) The most simplifying factor is that the QP-ports to Cortex-M don't need to change at all (the correct port is selected automatically based on the standard preprocessor macros provided by the compiler). + +

+ +

+ ## Features Demonstrated - multiple cooperating active objects - immutable (const) events @@ -67,7 +74,7 @@ examples\arm-cm\dpp_nucleo-c031c6 | ``` -# Builing the example +# Building the example ### GNU/ARM - open terminal window @@ -106,6 +113,17 @@ in IAR EWARM IDE. Build/Debug/Download to the board from the IDE. - Change the build configuration in the "Project Configuration" drop-down menu. +# Uploading the Binary to the Board +The STM32 NUCLEO boards enumerate as a USB drive when connected to the host computer. The boards then can be programmed by **copying** the binary to that USB drive. This can be useful for the command-line GNU/ARM build. For example, to program the binary produced for the Debug configuration, you can type: + +``` +copy dbg\dpp-qk.bin E: +``` +NOTE: The above command assumes that the NUCLEO board enumerated as drive E:. Of course you need to adjust the command for your specific drive letter. + +Alternatively, if you use IDEs, such as KEIL-MDK or IAR EWARM, you can program the board from the IDE (e.g., by starting a debug session). + + # Tracing with QP/Spy When the board is flashed with the Spy build configuration, it produces the QP/Spy software tracing output to the built-in virtual COM port of the TivaC LauchPad board. The trace is binary rather than ASCII, and therefore requires a special host-based application called QSPY. diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qp_arm-cm.jpg b/examples/arm-cm/dpp_nucleo-c031c6/qp_arm-cm.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5d206b5b91e0ca4ba98813822a8e0ce13b344da9 GIT binary patch literal 19322 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 HyovwWvWaYd literal 0 HcmV?d00001 From ab9b8038827ea1853d6604a5189721f48bc11aa7 Mon Sep 17 00:00:00 2001 From: MMS Date: Thu, 4 Jan 2024 13:48:25 -0500 Subject: [PATCH 2/2] 7.3.2 --- examples/arm-cm/README.md | 146 ++++++++++++++++++ examples/arm-cm/dpp_nucleo-c031c6/README.md | 2 +- .../{dpp_nucleo-c031c6 => }/qp_arm-cm.jpg | Bin examples/arm-cm/qspy-output.png | Bin 0 -> 30404 bytes 4 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 examples/arm-cm/README.md rename examples/arm-cm/{dpp_nucleo-c031c6 => }/qp_arm-cm.jpg (100%) create mode 100644 examples/arm-cm/qspy-output.png diff --git a/examples/arm-cm/README.md b/examples/arm-cm/README.md new file mode 100644 index 00000000..f371946a --- /dev/null +++ b/examples/arm-cm/README.md @@ -0,0 +1,146 @@ +> **NOTE** +This file is best viewed in a **markdown viewer**, such as the one built into GitHub. Markdown viewers are also available as plug-ins to popular Internet browsers. + +# About QP Examples for ARM Cortex-M (arm-cm) +This directory provides QP examples for ARM Cortex-M based MCUs. + +These examples are intended to be used "as-is", or [adapted](#adapting-the-examples) for any ARM Cortex-M MCU that is not directly supported. + +

+ +

+ +> **NOTE** +The most simplifying factor is that the QP-ports to Cortex-M don't need to change at all (the correct port is selected automatically based on the standard preprocessor macros provided by the compiler). + +# Example Applications +This directory contains two types of example applications: +- `blinky_` demonstrates a [simple "blinky" application](https://www.state-machine.com/qpc/tut_blinky.html) with only one Active Object that periodically blinks an on-board LED. The "blinky" example is intentionally minimal and demonstrates only the QV and QK kernels (QXK is not demonstrated). Also, this example does not demonstrate the [QP/Spy software tracing](https://www.state-machine.com/qtools/qpspy.html). + +- `dpp_` demonstrates a more complete ["DPP" application (Dining Philosophers Problem)](https://www.state-machine.com/qpc/tut_dpp.html), with multiple, communicating Active Objects. The "dpp" example demonstrates all three built-in kernels (QV, QK, and QXK). Also, this example demonstrates the [QP/Spy software tracing](https://www.state-machine.com/qtools/qpspy.html). + +# Supported Compilers +The following compilers/toolchains for ARM Cortex-M are supported and demonstrated: +- ARM-KEIL toolchain +- GNU-ARM toolchain +- IAR-ARM toolchain + +## Build Configurations +- Debug +- Release +- Spy (only in the "DPP" examples) + +# Adapting the Examples +With dozens of silicon vendors offering ARM Cortex-M MCUs, each providing hundreds if not thousands of MCU variants, it is *impossible* to offer direct support for each and every such MCU. But this is also not necessary because the already provided examples can be adapted relatively easily. The most important simplifying fact is that the [QP-ports to Cortex-M](https://www.state-machine.com/qpc/arm-cm.html) don't need to change at all. + +This is how you might go about an MCU that is not directly supported in the `qpc/examples/arm-cm`: + +- choose example that most closely matches your particular MCU. In your case of the NXP MKE02Z64VLC2, which is based on the Cortex-M0+ core, the closest are the examples for NUCLEO-C031C6 + +- choose the kernel you'd like to use. For example, assuming that you like QK, you are interested in the qk subdirectory. + +- choose the compiler you'd like to use. For example, assuming that you like GNU-ARM, you are interested in the gnu subdirectory + +- build the chosen example project. Again, it **doesn't matter** at this stage that it is not exacly your final hardware. Your objective is testing your QP installation and the compiler installation. You are also getting familiar with QP. These goals are worth but a few minutes of your time. + +- at this point, it is highly recommend that you just buy one of the supported ARM Cortex-M boards, which are carefully chosen to be very inexpensive. With your own board, you'd be able to run and debug the QP application at your desk, which is priceless because as you surely remember: *In embedded systems NOTING works until EVERYTHING works*. + +- only *after* you get started with a working example, you can try to modify it for your own board. This typically requiers only changes to the BSP (Board Support Package), which is provided in the `bsp.cpp` file. + + +# Code Organization +The following listing shows a typical organization of the example code: +``` +examples\arm-cm\dpp_nucleo-c031c6 +| ++---qk // preemptive QK kernel +| +---gnu // GNU-ARM toolchain +| | \---targetConfigs +| | Makefile // Makefile for GNU-ARM +| +---armclang // ARM/KEIL toolchain with Compiler 6 (ARM/CLANG) +| | dpp-qk.uvprojx // uVision project +| \---iar // IAR EWARM +| dpp-qk.eww // IAR EW-ARM workspace +| +\---qv // cooperative QK kernel +| +---gnu // GNU-ARM toolchain +| | \---targetConfigs +| | Makefile // Makefile for GNU-ARM +| +---armclang // ARM/KEIL toolchain with Compiler 6 (ARM/CLANG) +| | dpp-qv.uvprojx // uVision project +| \---iar // IAR EWARM +| dpp-qv.eww // IAR EW-ARM workspace +| ++---qxk // preemptive, dual-mode QXK kernel +| +---gnu // GNU-ARM toolchain +| | \---targetConfigs +| | Makefile // Makefile for GNU-ARM +| +---armclang // ARM/KEIL toolchain with Compiler 6 (ARM/CLANG) +| | dpp-qk.uvprojx // uVision project +| \---iar // IAR EWARM +| dpp-qk.eww // IAR EW-ARM workspace +| +``` + +# Building the example + +### GNU/ARM +- open terminal window +- change to the desired directory (either `examples\arm-cm\dpp_nucleo-c031c6\qk\gnu`, `examples\arm-cm\dpp_nucleo-c031c6\qv\gnu`, or `examples\arm-cm\dpp_nucleo-c031c6\qxk\gnu`) +- to build the default Debug configuration, type: + +``` +make +``` + +> **NOTE** +The `make` utility for Windows is provided in the QTools collection for Windows. + +- to build the Release configuration, type: + +``` +make CONF=rel +``` + +- to build the Spy configuration, type: + +``` +make CONF=spy +``` + + +### ARM/KEIL MDK +- Open the provided KEIL uVision project (either `dpp-qk.uvprojx`, `dpp-qv.uvprojx`, or `dpp-qxk.uvprojx`) +in Keil uVision IDE. Build/Debug/Download to the board from the IDE. +- Change the build configuration in the "Project Target" drop-down menu. + + +### IAR EWARM +- Open the provided IAR EWARM workspace (either `dpp-qk.eww`, `dpp-qv.eww`, or `dpp-qxk.eww`) +in IAR EWARM IDE. Build/Debug/Download to the board from the IDE. +- Change the build configuration in the "Project Configuration" drop-down menu. + + + +# Tracing with QP/Spy +When the board is flashed with the Spy build configuration, it produces the QP/Spy software tracing output to the built-in virtual COM port of the TivaC LauchPad board. The trace is binary rather than ASCII, and therefore requires a special host-based application called QSPY. + +> **NOTE** QSPY host application is available in the QTools collection. + +To launch the QSPY host application: +- open terminal window +- type: + +``` +qspy -c COM5 +``` + +where "COM5" is an example virtual COM port enumerated by the board. You need to check the specific COM port number on your host computer using the Device Manager application, Ports (COM and LPT) section. + + +The following screen shot shows a typical output from QSPY: + +

+
+Typical QSPY output produced by the Spy build configuration +

diff --git a/examples/arm-cm/dpp_nucleo-c031c6/README.md b/examples/arm-cm/dpp_nucleo-c031c6/README.md index fe6f55ae..61cab817 100644 --- a/examples/arm-cm/dpp_nucleo-c031c6/README.md +++ b/examples/arm-cm/dpp_nucleo-c031c6/README.md @@ -13,7 +13,7 @@ This example demonstrates the [Dining Philosophers Problem (DPP) application](ht This example can be used as a starting point for any other ARM Cortex-M MCU, including those based on differnt Cortex-M cores (M0/M0+/M3/M4/M7/M23/M33/M55/M85...) The most simplifying factor is that the QP-ports to Cortex-M don't need to change at all (the correct port is selected automatically based on the standard preprocessor macros provided by the compiler).

- +

## Features Demonstrated diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qp_arm-cm.jpg b/examples/arm-cm/qp_arm-cm.jpg similarity index 100% rename from examples/arm-cm/dpp_nucleo-c031c6/qp_arm-cm.jpg rename to examples/arm-cm/qp_arm-cm.jpg diff --git a/examples/arm-cm/qspy-output.png b/examples/arm-cm/qspy-output.png new file mode 100644 index 0000000000000000000000000000000000000000..ee764450fc698007b726222ee98e0c4ff8a2347d GIT binary patch literal 30404 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

5IoT*WP_S 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

48s!6PLv3#1J$zTBSi{a{Ql)}O! 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 literal 0 HcmV?d00001