From 4a92b2010525831f99647d0f58eff2a6d25e4cea Mon Sep 17 00:00:00 2001
From: MMS
Date: Thu, 11 Aug 2022 15:56:46 -0400
Subject: [PATCH] 7.0.1
---
.gitignore | 3 +-
.gitmodules | 3 +
3rd_party | 1 +
LICENSES/LicenseRef-QL-dual.qlc | 26 +
LICENSES/QM-EVAL-QPC.qlc | 25 +
LICENSES/QP-Arduino_GPL_Exception.txt | 46 +
LICENSES/QP-RasPi_GPL_Exception.txt | 48 +
LICENSES/QP-mbed_GPL_Exception.txt | 42 +
README.md | 29 +-
doxygen/Doxyfile | 86 +-
doxygen/Doxyfile-CERT | 3 +-
doxygen/Doxyfile-CHM | 8 +-
doxygen/DoxygenLayout.xml | 240 +
doxygen/api.dox | 37 +-
doxygen/config.h | 411 +
doxygen/dir.dox | 46 +-
doxygen/exa.dox | 50 +-
doxygen/exa_native.dox | 48 +-
doxygen/exa_os.dox | 2 -
doxygen/exa_qutest.dox | 2 -
doxygen/exa_rtos.dox | 149 +-
doxygen/gs.dox | 138 +-
doxygen/history.dox | 337 +-
doxygen/images/an-oop_in_c.jpg | Bin 0 -> 48945 bytes
doxygen/images/bd_mbed-LPC1768.jpg | Bin 13232 -> 11155 bytes
doxygen/images/github-star.jpg | Bin 0 -> 25587 bytes
doxygen/images/logo_embos.png | Bin 0 -> 18688 bytes
doxygen/images/logo_freertos.png | Bin 0 -> 89008 bytes
doxygen/images/logo_pclintplus.jpg | Bin 0 -> 33186 bytes
doxygen/images/logo_threadx.jpg | Bin 0 -> 6754 bytes
doxygen/images/logo_uc-os2.jpg | Bin 0 -> 10905 bytes
doxygen/images/logo_zephyr.jpg | Bin 0 -> 10155 bytes
doxygen/images/qpc_gh.jpg | Bin 92958 -> 104146 bytes
doxygen/img/cert-pack.png | Bin 0 -> 9971 bytes
doxygen/img/help_dark.png | Bin 920 -> 774 bytes
doxygen/img/help_light.png | Bin 965 -> 705 bytes
doxygen/img/img.htm | 3 +-
doxygen/img/logo_github.png | Bin 2807 -> 3002 bytes
doxygen/main.dox | 98 +-
doxygen/make.bat | 186 +-
doxygen/metrics.dox | 331 +-
doxygen/modules-unused.dox | 271 +
doxygen/ports.dox | 123 +-
doxygen/ports_arm-cm.dox | 908 +-
doxygen/ports_native.dox | 136 +-
doxygen/ports_os.dox | 2 +-
doxygen/ports_rtos.dox | 154 +-
doxygen/rsm.bat | 88 +-
doxygen/rsm_qpc.cfg | 14 +-
doxygen/snippets/qa_run.c | 2 +-
doxygen/snippets/qep_qfsm_use.c | 4 +-
doxygen/snippets/qep_qhsm_use.c | 4 +-
doxygen/snippets/qf_tevt.c | 18 +
doxygen/snippets/qf_tick.c | 4 +-
doxygen/snippets/qf_tickx.c | 4 +-
doxygen/snippets/qs_objArrDic.c | 6 +
.../arm-cm/blinky_efm32-slstk3401a/README.md | 5 +
.../qk/armclang/blinky-qk.uvoptx | 2 +-
.../qk/armclang/blinky-qk.uvprojx | 14 +-
.../arm-cm/blinky_efm32-slstk3401a/qk/bsp.c | 2 +-
.../blinky_efm32-slstk3401a/qk/gnu/Makefile | 5 +-
.../blinky_efm32-slstk3401a/qk/gnu/flash.bat | 96 +-
.../qk/iar/blinky-qk.ewd | 8426 ++++-----
.../qk/iar/blinky-qk.ewp | 6371 ++++---
.../qk/iar/blinky-qk.eww | 20 +-
.../qk/iar/blinky-qk.icf | 56 +-
.../qv/armclang/blinky-qv.uvprojx | 6 +-
.../arm-cm/blinky_efm32-slstk3401a/qv/bsp.c | 2 +-
.../blinky_efm32-slstk3401a/qv/gnu/Makefile | 5 +-
.../blinky_efm32-slstk3401a/qv/gnu/flash.bat | 96 +-
.../qv/iar/blinky-qv.ewd | 8918 +++++-----
.../qv/iar/blinky-qv.ewp | 6647 ++++----
.../qv/iar/blinky-qv.eww | 20 +-
.../qv/iar/blinky-qv.icf | 56 +-
.../arm-cm/blinky_ek-tm4c123gxl/README.md | 5 +
.../qk/armclang/blinky-qk.uvprojx | 6 +-
examples/arm-cm/blinky_ek-tm4c123gxl/qk/bsp.c | 2 +-
.../blinky_ek-tm4c123gxl/qk/gnu/Makefile | 5 +-
.../blinky_ek-tm4c123gxl/qk/gnu/flash.bat | 64 +-
.../blinky_ek-tm4c123gxl/qk/iar/blinky-qk.ewd | 8426 ++++-----
.../blinky_ek-tm4c123gxl/qk/iar/blinky-qk.ewp | 6349 ++++---
.../blinky_ek-tm4c123gxl/qk/iar/blinky-qk.eww | 20 +-
.../blinky_ek-tm4c123gxl/qk/iar/blinky-qk.icf | 56 +-
.../qv/armclang/blinky-qv.uvprojx | 6 +-
examples/arm-cm/blinky_ek-tm4c123gxl/qv/bsp.c | 2 +-
.../blinky_ek-tm4c123gxl/qv/gnu/Makefile | 5 +-
.../blinky_ek-tm4c123gxl/qv/gnu/flash.bat | 64 +-
.../blinky_ek-tm4c123gxl/qv/iar/blinky-qv.ewd | 8924 +++++-----
.../blinky_ek-tm4c123gxl/qv/iar/blinky-qv.ewp | 6049 ++++---
.../blinky_ek-tm4c123gxl/qv/iar/blinky-qv.eww | 20 +-
.../blinky_ek-tm4c123gxl/qv/iar/blinky-qv.icf | 56 +-
.../arm-cm/dpp_efm32-slstk3401a/README.md | 5 +
examples/arm-cm/dpp_efm32-slstk3401a/dpp.h | 66 +-
examples/arm-cm/dpp_efm32-slstk3401a/dpp.qm | 15 +-
examples/arm-cm/dpp_efm32-slstk3401a/philo.c | 107 +-
.../qk/armclang/dpp-qk.uvoptx | 13 +-
.../qk/armclang/dpp-qk.uvprojx | 78 +-
examples/arm-cm/dpp_efm32-slstk3401a/qk/bsp.c | 6 +-
.../dpp_efm32-slstk3401a/qk/gnu/Makefile | 9 +-
.../dpp_efm32-slstk3401a/qk/gnu/flash.bat | 96 +-
.../dpp_efm32-slstk3401a/qk/iar/dpp-qk.ewd | 8426 ++++-----
.../dpp_efm32-slstk3401a/qk/iar/dpp-qk.ewp | 6812 ++++----
.../dpp_efm32-slstk3401a/qk/iar/dpp-qk.eww | 20 +-
.../dpp_efm32-slstk3401a/qk/iar/dpp-qk.icf | 56 +-
.../qv/armclang/dpp-qv.uvprojx | 6 +-
examples/arm-cm/dpp_efm32-slstk3401a/qv/bsp.c | 6 +-
.../dpp_efm32-slstk3401a/qv/gnu/Makefile | 5 +-
.../dpp_efm32-slstk3401a/qv/gnu/flash.bat | 96 +-
.../dpp_efm32-slstk3401a/qv/iar/dpp-qv.ewd | 8426 ++++-----
.../dpp_efm32-slstk3401a/qv/iar/dpp-qv.ewp | 6377 ++++---
.../dpp_efm32-slstk3401a/qv/iar/dpp-qv.eww | 20 +-
.../dpp_efm32-slstk3401a/qv/iar/dpp-qv.icf | 56 +-
.../dpp_efm32-slstk3401a/qview/qview-dpp.bat | 16 +-
.../dpp_efm32-slstk3401a/qview/qview-dpp1.bat | 16 +-
.../qxk/armclang/dpp-qxk.uvoptx | 6 +-
.../qxk/armclang/dpp-qxk.uvprojx | 65 +-
.../arm-cm/dpp_efm32-slstk3401a/qxk/bsp.c | 8 +-
.../dpp_efm32-slstk3401a/qxk/gnu/Makefile | 11 +-
.../dpp_efm32-slstk3401a/qxk/gnu/flash.bat | 96 +-
.../dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.ewd | 8426 ++++-----
.../dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.ewp | 6842 ++++----
.../dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.eww | 20 +-
.../dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.icf | 56 +-
.../arm-cm/dpp_efm32-slstk3401a/qxk/test.c | 2 +-
examples/arm-cm/dpp_efm32-slstk3401a/table.c | 113 +-
.../dpp_efm32-slstk3401a/win32-gui/bsp.c | 2 +-
.../win32-gui/dpp-gui.sln | 46 +-
.../win32-gui/dpp-gui.vcxproj | 546 +-
.../win32-gui/dpp-gui.vcxproj.filters | 90 +-
examples/arm-cm/dpp_ek-tm4c123gxl/README.md | 5 +
examples/arm-cm/dpp_ek-tm4c123gxl/dpp.h | 70 +-
examples/arm-cm/dpp_ek-tm4c123gxl/dpp.qm | 12 +-
.../dpp_ek-tm4c123gxl/lint-plus/lin.bat | 128 +-
examples/arm-cm/dpp_ek-tm4c123gxl/philo.c | 109 +-
.../qk/armclang/dpp-qk.uvprojx | 6 +-
examples/arm-cm/dpp_ek-tm4c123gxl/qk/bsp.c | 6 +-
.../arm-cm/dpp_ek-tm4c123gxl/qk/gnu/Makefile | 5 +-
.../arm-cm/dpp_ek-tm4c123gxl/qk/gnu/flash.bat | 64 +-
.../qk/gnu_with-stack-prot/Makefile | 5 +-
.../qk/gnu_with-stack-prot/bsp_stack-prot.c | 6 +-
.../qk/gnu_with-stack-prot/flash.bat | 64 +-
.../dpp_ek-tm4c123gxl/qk/iar/dpp-qk.ewd | 8426 ++++-----
.../dpp_ek-tm4c123gxl/qk/iar/dpp-qk.ewp | 6649 ++++----
.../dpp_ek-tm4c123gxl/qk/iar/dpp-qk.eww | 20 +-
.../dpp_ek-tm4c123gxl/qk/iar/dpp-qk.icf | 56 +-
.../qv/armclang/dpp-qv.uvprojx | 6 +-
examples/arm-cm/dpp_ek-tm4c123gxl/qv/bsp.c | 6 +-
.../arm-cm/dpp_ek-tm4c123gxl/qv/gnu/Makefile | 5 +-
.../arm-cm/dpp_ek-tm4c123gxl/qv/gnu/flash.bat | 64 +-
.../dpp_ek-tm4c123gxl/qv/iar/dpp-qv.ewd | 8426 ++++-----
.../dpp_ek-tm4c123gxl/qv/iar/dpp-qv.ewp | 6373 ++++---
.../dpp_ek-tm4c123gxl/qv/iar/dpp-qv.eww | 20 +-
.../dpp_ek-tm4c123gxl/qv/iar/dpp-qv.icf | 56 +-
.../dpp_ek-tm4c123gxl/qview/qview-dpp.bat | 16 +-
.../dpp_ek-tm4c123gxl/qview/qview-dpp1.bat | 16 +-
.../qxk/armclang/dpp-qxk.uvprojx | 6 +-
examples/arm-cm/dpp_ek-tm4c123gxl/qxk/bsp.c | 10 +-
.../arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/Makefile | 5 +-
.../dpp_ek-tm4c123gxl/qxk/gnu/flash.bat | 64 +-
.../dpp_ek-tm4c123gxl/qxk/iar/dpp-qxk.ewd | 8426 ++++-----
.../dpp_ek-tm4c123gxl/qxk/iar/dpp-qxk.ewp | 6641 ++++----
.../dpp_ek-tm4c123gxl/qxk/iar/dpp-qxk.eww | 20 +-
.../dpp_ek-tm4c123gxl/qxk/iar/dpp-qxk.icf | 56 +-
examples/arm-cm/dpp_ek-tm4c123gxl/qxk/test.c | 2 +-
examples/arm-cm/dpp_ek-tm4c123gxl/table.c | 117 +-
examples/arm-cm/dpp_mbed-lpc1768/README.md | 5 +
examples/arm-cm/dpp_mbed-lpc1768/dpp.h | 66 +-
examples/arm-cm/dpp_mbed-lpc1768/dpp.qm | 15 +-
examples/arm-cm/dpp_mbed-lpc1768/philo.c | 112 +-
.../qk/armclang/dpp-qk.uvprojx | 6 +-
examples/arm-cm/dpp_mbed-lpc1768/qk/bsp.c | 6 +-
.../arm-cm/dpp_mbed-lpc1768/qk/gnu/Makefile | 5 +-
.../arm-cm/dpp_mbed-lpc1768/qk/iar/dpp-qk.ewd | 8924 +++++-----
.../arm-cm/dpp_mbed-lpc1768/qk/iar/dpp-qk.ewp | 6019 ++++---
.../arm-cm/dpp_mbed-lpc1768/qk/iar/dpp-qk.eww | 20 +-
.../arm-cm/dpp_mbed-lpc1768/qk/iar/dpp-qk.icf | 76 +-
.../qv/armclang/dpp-qv.uvprojx | 6 +-
examples/arm-cm/dpp_mbed-lpc1768/qv/bsp.c | 6 +-
.../arm-cm/dpp_mbed-lpc1768/qv/gnu/Makefile | 5 +-
.../arm-cm/dpp_mbed-lpc1768/qv/iar/dpp-qv.ewd | 8924 +++++-----
.../arm-cm/dpp_mbed-lpc1768/qv/iar/dpp-qv.ewp | 6037 ++++---
.../arm-cm/dpp_mbed-lpc1768/qv/iar/dpp-qv.eww | 20 +-
.../arm-cm/dpp_mbed-lpc1768/qv/iar/dpp-qv.icf | 76 +-
examples/arm-cm/dpp_mbed-lpc1768/table.c | 118 +-
examples/arm-cm/dpp_nucleo-h743zi/README.md | 5 +
examples/arm-cm/dpp_nucleo-h743zi/dpp.h | 70 +-
examples/arm-cm/dpp_nucleo-h743zi/dpp.qm | 12 +-
examples/arm-cm/dpp_nucleo-h743zi/philo.c | 113 +-
.../qk/armclang/dpp-qk.uvprojx | 6 +-
examples/arm-cm/dpp_nucleo-h743zi/qk/bsp.c | 7 +-
.../arm-cm/dpp_nucleo-h743zi/qk/gnu/Makefile | 8 +-
.../dpp_nucleo-h743zi/qk/iar/dpp-qk.ewp | 6629 ++++----
.../dpp_nucleo-h743zi/qk/iar/dpp-qk.eww | 20 +-
.../dpp_nucleo-h743zi/qk/iar/dpp-qk.icf | 166 +-
examples/arm-cm/dpp_nucleo-h743zi/qk/main.c | 1 -
.../qv/armclang/dpp-qv.uvprojx | 6 +-
examples/arm-cm/dpp_nucleo-h743zi/qv/bsp.c | 7 +-
.../arm-cm/dpp_nucleo-h743zi/qv/gnu/Makefile | 5 +-
.../dpp_nucleo-h743zi/qv/iar/dpp-qv.ewd | 8498 ++++-----
.../dpp_nucleo-h743zi/qv/iar/dpp-qv.ewp | 6629 ++++----
.../dpp_nucleo-h743zi/qv/iar/dpp-qv.eww | 20 +-
.../dpp_nucleo-h743zi/qv/iar/dpp-qv.icf | 166 +-
examples/arm-cm/dpp_nucleo-h743zi/qv/main.c | 1 -
.../dpp_nucleo-h743zi/qview/qview-dpp.bat | 16 +-
.../dpp_nucleo-h743zi/qview/qview-dpp1.bat | 16 +-
.../qxk/armclang/dpp-qxk.uvprojx | 6 +-
examples/arm-cm/dpp_nucleo-h743zi/qxk/bsp.c | 7 +-
.../arm-cm/dpp_nucleo-h743zi/qxk/gnu/Makefile | 5 +-
.../dpp_nucleo-h743zi/qxk/iar/dpp-qxk.ewd | 8498 ++++-----
.../dpp_nucleo-h743zi/qxk/iar/dpp-qxk.ewp | 6655 ++++----
.../dpp_nucleo-h743zi/qxk/iar/dpp-qxk.eww | 20 +-
.../dpp_nucleo-h743zi/qxk/iar/dpp-qxk.icf | 166 +-
examples/arm-cm/dpp_nucleo-h743zi/qxk/main.c | 1 -
examples/arm-cm/dpp_nucleo-h743zi/qxk/test.c | 2 +-
examples/arm-cm/dpp_nucleo-h743zi/table.c | 121 +-
examples/arm-cm/dpp_nucleo-l053r8/README.md | 5 +
examples/arm-cm/dpp_nucleo-l053r8/dpp.h | 70 +-
examples/arm-cm/dpp_nucleo-l053r8/dpp.qm | 12 +-
examples/arm-cm/dpp_nucleo-l053r8/philo.c | 113 +-
.../qk/armclang/dpp-qk.uvoptx | 25 +-
.../qk/armclang/dpp-qk.uvprojx | 78 +-
examples/arm-cm/dpp_nucleo-l053r8/qk/bsp.c | 6 +-
.../arm-cm/dpp_nucleo-l053r8/qk/gnu/Makefile | 9 +-
.../qk/gnu_with-stack-prot/Makefile | 5 +-
.../qk/gnu_with-stack-prot/bsp_stack-prot.c | 6 +-
.../dpp_nucleo-l053r8/qk/iar/dpp-qk.ewd | 8426 ++++-----
.../dpp_nucleo-l053r8/qk/iar/dpp-qk.ewp | 6852 ++++----
.../dpp_nucleo-l053r8/qk/iar/dpp-qk.eww | 20 +-
.../dpp_nucleo-l053r8/qk/iar/dpp-qk.icf | 72 +-
.../qv/armclang/dpp-qv.uvprojx | 6 +-
examples/arm-cm/dpp_nucleo-l053r8/qv/bsp.c | 6 +-
.../arm-cm/dpp_nucleo-l053r8/qv/gnu/Makefile | 5 +-
.../dpp_nucleo-l053r8/qv/iar/dpp-qv.ewd | 8426 ++++-----
.../dpp_nucleo-l053r8/qv/iar/dpp-qv.ewp | 6613 ++++---
.../dpp_nucleo-l053r8/qv/iar/dpp-qv.eww | 20 +-
.../dpp_nucleo-l053r8/qv/iar/dpp-qv.icf | 72 +-
.../dpp_nucleo-l053r8/qview/qview-dpp.bat | 16 +-
.../dpp_nucleo-l053r8/qview/qview-dpp1.bat | 16 +-
.../qxk/armclang/dpp-qxk.uvoptx | 4 +-
.../qxk/armclang/dpp-qxk.uvprojx | 57 +-
examples/arm-cm/dpp_nucleo-l053r8/qxk/bsp.c | 6 +-
.../arm-cm/dpp_nucleo-l053r8/qxk/gnu/Makefile | 11 +-
.../dpp_nucleo-l053r8/qxk/iar/dpp-qxk.ewd | 8426 ++++-----
.../dpp_nucleo-l053r8/qxk/iar/dpp-qxk.ewp | 6878 ++++----
.../dpp_nucleo-l053r8/qxk/iar/dpp-qxk.eww | 20 +-
.../dpp_nucleo-l053r8/qxk/iar/dpp-qxk.icf | 72 +-
examples/arm-cm/dpp_nucleo-l053r8/qxk/test.c | 6 +-
examples/arm-cm/dpp_nucleo-l053r8/table.c | 121 +-
examples/arm-cm/dpp_nucleo-l152re/dpp.h | 70 +-
examples/arm-cm/dpp_nucleo-l152re/dpp.qm | 12 +-
examples/arm-cm/dpp_nucleo-l152re/philo.c | 113 +-
.../qk/armclang/dpp-qk.uvprojx | 6 +-
examples/arm-cm/dpp_nucleo-l152re/qk/bsp.c | 6 +-
.../arm-cm/dpp_nucleo-l152re/qk/gnu/Makefile | 5 +-
.../dpp_nucleo-l152re/qk/iar/dpp-qk.ewd | 8498 ++++-----
.../dpp_nucleo-l152re/qk/iar/dpp-qk.ewp | 6613 ++++---
.../dpp_nucleo-l152re/qk/iar/dpp-qk.eww | 20 +-
.../dpp_nucleo-l152re/qk/iar/dpp-qk.icf | 70 +-
.../qk/visualgdb/dpp-qk-Spy.vgdbsettings | 266 +-
.../dpp_nucleo-l152re/qk/visualgdb/dpp-qk.sln | 56 +-
.../qk/visualgdb/dpp-qk.vcxproj | 294 +-
.../qk/visualgdb/dpp-qk.vcxproj.filters | 272 +-
.../qk/visualgdb/stm32.props | 62 +-
.../dpp_nucleo-l152re/qk/visualgdb/stm32.xml | 76 +-
.../dpp_nucleo-l152re/qspy200824_123412.seq | 252 +-
.../dpp_nucleo-l152re/qspy200824_123438.seq | 198 +-
.../qv/armclang/dpp-qv.uvoptx | 15 +-
.../qv/armclang/dpp-qv.uvprojx | 27 +-
examples/arm-cm/dpp_nucleo-l152re/qv/bsp.c | 6 +-
.../arm-cm/dpp_nucleo-l152re/qv/gnu/Makefile | 5 +-
.../dpp_nucleo-l152re/qv/iar/dpp-qv.ewd | 8918 +++++-----
.../dpp_nucleo-l152re/qv/iar/dpp-qv.ewp | 6619 ++++---
.../dpp_nucleo-l152re/qv/iar/dpp-qv.eww | 20 +-
.../dpp_nucleo-l152re/qv/iar/dpp-qv.icf | 70 +-
.../dpp_nucleo-l152re/qview/qview-dpp.bat | 16 +-
.../dpp_nucleo-l152re/qview/qview-dpp1.bat | 16 +-
.../qxk/armclang/dpp-qxk.uvprojx | 6 +-
examples/arm-cm/dpp_nucleo-l152re/qxk/bsp.c | 6 +-
.../arm-cm/dpp_nucleo-l152re/qxk/gnu/Makefile | 5 +-
.../dpp_nucleo-l152re/qxk/iar/dpp-qxk.ewd | 8498 ++++-----
.../dpp_nucleo-l152re/qxk/iar/dpp-qxk.ewp | 6637 ++++----
.../dpp_nucleo-l152re/qxk/iar/dpp-qxk.eww | 20 +-
.../dpp_nucleo-l152re/qxk/iar/dpp-qxk.icf | 70 +-
examples/arm-cm/dpp_nucleo-l152re/qxk/test.c | 2 +-
examples/arm-cm/dpp_nucleo-l152re/table.c | 121 +-
examples/arm-cm/dpp_nucleo-l552ze/dpp.h | 70 +-
examples/arm-cm/dpp_nucleo-l552ze/dpp.qm | 12 +-
examples/arm-cm/dpp_nucleo-l552ze/philo.c | 113 +-
examples/arm-cm/dpp_nucleo-l552ze/qk/bsp.c | 7 +-
.../arm-cm/dpp_nucleo-l552ze/qk/gnu/Makefile | 5 +-
.../dpp_nucleo-l552ze/qk/iar/dpp-qk.ewp | 3 -
examples/arm-cm/dpp_nucleo-l552ze/qk/main.c | 1 -
examples/arm-cm/dpp_nucleo-l552ze/qv/bsp.c | 7 +-
.../arm-cm/dpp_nucleo-l552ze/qv/gnu/Makefile | 5 +-
.../dpp_nucleo-l552ze/qv/iar/dpp-qv.ewp | 3 -
examples/arm-cm/dpp_nucleo-l552ze/qv/main.c | 1 -
examples/arm-cm/dpp_nucleo-l552ze/qxk/bsp.c | 7 +-
.../arm-cm/dpp_nucleo-l552ze/qxk/gnu/Makefile | 5 +-
.../dpp_nucleo-l552ze/qxk/iar/dpp-qxk.ewp | 3 -
examples/arm-cm/dpp_nucleo-l552ze/qxk/main.c | 1 -
examples/arm-cm/dpp_nucleo-l552ze/qxk/test.c | 2 +-
examples/arm-cm/dpp_nucleo-l552ze/table.c | 121 +-
.../arm-cm/dpp_stm32f4-discovery/README.md | 5 +
examples/arm-cm/dpp_stm32f4-discovery/dpp.h | 70 +-
examples/arm-cm/dpp_stm32f4-discovery/dpp.qm | 15 +-
examples/arm-cm/dpp_stm32f4-discovery/philo.c | 106 +-
.../qk/armclang/dpp-qk.uvprojx | 6 +-
.../arm-cm/dpp_stm32f4-discovery/qk/bsp.c | 6 +-
.../dpp_stm32f4-discovery/qk/gnu/Makefile | 5 +-
.../dpp_stm32f4-discovery/qk/gnu/flash.bat | 46 +-
.../dpp_stm32f4-discovery/qk/iar/dpp-qk.ewd | 8426 ++++-----
.../dpp_stm32f4-discovery/qk/iar/dpp-qk.ewp | 6397 ++++---
.../dpp_stm32f4-discovery/qk/iar/dpp-qk.eww | 20 +-
.../dpp_stm32f4-discovery/qk/iar/dpp-qk.icf | 68 +-
.../qv/armclang/dpp-qv.uvprojx | 6 +-
.../arm-cm/dpp_stm32f4-discovery/qv/bsp.c | 6 +-
.../dpp_stm32f4-discovery/qv/gnu/Makefile | 5 +-
.../dpp_stm32f4-discovery/qv/gnu/flash.bat | 46 +-
.../dpp_stm32f4-discovery/qv/iar/dpp-qv.ewd | 8426 ++++-----
.../dpp_stm32f4-discovery/qv/iar/dpp-qv.ewp | 6373 ++++---
.../dpp_stm32f4-discovery/qv/iar/dpp-qv.eww | 20 +-
.../dpp_stm32f4-discovery/qv/iar/dpp-qv.icf | 68 +-
.../qxk/armclang/dpp-qxk.uvprojx | 6 +-
.../arm-cm/dpp_stm32f4-discovery/qxk/bsp.c | 6 +-
.../dpp_stm32f4-discovery/qxk/gnu/Makefile | 5 +-
.../dpp_stm32f4-discovery/qxk/gnu/flash.bat | 46 +-
.../dpp_stm32f4-discovery/qxk/iar/dpp-qxk.ewd | 8426 ++++-----
.../dpp_stm32f4-discovery/qxk/iar/dpp-qxk.ewp | 6421 ++++---
.../dpp_stm32f4-discovery/qxk/iar/dpp-qxk.eww | 20 +-
.../dpp_stm32f4-discovery/qxk/iar/dpp-qxk.icf | 68 +-
.../arm-cm/dpp_stm32f4-discovery/qxk/test.c | 2 +-
examples/arm-cm/dpp_stm32f4-discovery/table.c | 114 +-
.../arm-cm/game_efm32-slstk3401a/README.md | 72 +
examples/arm-cm/game_efm32-slstk3401a/game.h | 67 +-
examples/arm-cm/game_efm32-slstk3401a/game.qm | 6 +-
examples/arm-cm/game_efm32-slstk3401a/mine1.c | 111 +-
examples/arm-cm/game_efm32-slstk3401a/mine2.c | 111 +-
.../arm-cm/game_efm32-slstk3401a/missile.c | 107 +-
.../qk/armclang/game-qk.uvprojx | 6 +-
.../arm-cm/game_efm32-slstk3401a/qk/bsp.c | 6 +-
.../game_efm32-slstk3401a/qk/gnu/Makefile | 5 +-
.../game_efm32-slstk3401a/qk/gnu/flash.bat | 96 +-
.../game_efm32-slstk3401a/qk/iar/game-qk.ewd | 9164 +++++-----
.../game_efm32-slstk3401a/qk/iar/game-qk.ewp | 6635 ++++----
.../game_efm32-slstk3401a/qk/iar/game-qk.eww | 20 +-
.../game_efm32-slstk3401a/qk/iar/game-qk.icf | 56 +-
.../qv/armclang/game-qv.uvprojx | 6 +-
.../arm-cm/game_efm32-slstk3401a/qv/bsp.c | 6 +-
.../game_efm32-slstk3401a/qv/gnu/Makefile | 5 +-
.../game_efm32-slstk3401a/qv/gnu/flash.bat | 96 +-
.../game_efm32-slstk3401a/qv/iar/game-qv.ewd | 9482 +++++------
.../game_efm32-slstk3401a/qv/iar/game-qv.ewp | 6137 ++++---
.../game_efm32-slstk3401a/qv/iar/game-qv.eww | 20 +-
.../game_efm32-slstk3401a/qv/iar/game-qv.icf | 56 +-
examples/arm-cm/game_efm32-slstk3401a/ship.c | 114 +-
.../arm-cm/game_efm32-slstk3401a/tunnel.c | 190 +-
.../game_efm32-slstk3401a/win32-gui/bsp.c | 6 +-
.../win32-gui/game-gui.sln | 46 +-
.../win32-gui/game-gui.vcxproj | 586 +-
.../win32-gui/game-gui.vcxproj.filters | 130 +-
.../game_efm32-slstk3401a/win32-gui/make.bat | 48 +-
.../arm-cm/low-power_ek-tm4c123gxl/README.md | 5 +
.../arm-cm/low-power_ek-tm4c123gxl/blinky0.c | 111 +-
.../arm-cm/low-power_ek-tm4c123gxl/blinky1.c | 111 +-
.../low-power_ek-tm4c123gxl/low-power.qm | 4 +-
.../low-power_ek-tm4c123gxl/low_power.h | 59 +-
.../qk/armclang/low-power-qk.uvprojx | 6 +-
.../arm-cm/low-power_ek-tm4c123gxl/qk/bsp.c | 6 +-
.../low-power_ek-tm4c123gxl/qk/gnu/Makefile | 5 +-
.../low-power_ek-tm4c123gxl/qk/gnu/flash.bat | 64 +-
.../qk/iar/low-power-qk.ewd | 8426 ++++-----
.../qk/iar/low-power-qk.ewp | 6529 ++++---
.../qk/iar/low-power-qk.eww | 20 +-
.../qk/iar/low-power-qk.icf | 56 +-
.../qv/armclang/low-power-qv.uvprojx | 6 +-
.../arm-cm/low-power_ek-tm4c123gxl/qv/bsp.c | 6 +-
.../low-power_ek-tm4c123gxl/qv/gnu/Makefile | 5 +-
.../low-power_ek-tm4c123gxl/qv/gnu/flash.bat | 64 +-
.../qv/iar/low-power-qv.ewd | 8426 ++++-----
.../qv/iar/low-power-qv.ewp | 6523 ++++---
.../qv/iar/low-power-qv.eww | 20 +-
.../qv/iar/low-power-qv.icf | 56 +-
.../qxk/armclang/low-power-qxk.uvprojx | 6 +-
.../arm-cm/low-power_ek-tm4c123gxl/qxk/bsp.c | 6 +-
.../low-power_ek-tm4c123gxl/qxk/gnu/Makefile | 5 +-
.../low-power_ek-tm4c123gxl/qxk/gnu/flash.bat | 64 +-
.../qxk/iar/low-power-qxk.ewd | 8426 ++++-----
.../qxk/iar/low-power-qxk.ewp | 6541 ++++---
.../qxk/iar/low-power-qxk.eww | 20 +-
.../qxk/iar/low-power-qxk.icf | 56 +-
.../blinky_launchxl2-tms57012/README.md | 5 +
.../arm-cr/blinky_launchxl2-tms57012/qk/bsp.c | 2 +-
.../qk/iar/blinky-qk.ewd | 9800 +++++------
.../qk/iar/blinky-qk.ewp | 6157 ++++---
.../qk/iar/blinky-qk.eww | 20 +-
.../qk/iar/blinky-qk.icf | 90 +-
.../blinky_launchxl2-tms57012/qk/ti/.cproject | 564 +-
.../blinky_launchxl2-tms57012/qk/ti/.project | 150 +-
.../arm-cr/blinky_launchxl2-tms57012/qv/bsp.c | 2 +-
.../qv/iar/blinky-qv.ewd | 9800 +++++------
.../qv/iar/blinky-qv.ewp | 6145 ++++---
.../qv/iar/blinky-qv.eww | 20 +-
.../qv/iar/blinky-qv.icf | 90 +-
.../blinky_launchxl2-tms57012/qv/ti/.cproject | 600 +-
.../blinky_launchxl2-tms57012/qv/ti/.project | 150 +-
.../arm-cr/dpp_launchxl2-tms57012/README.md | 5 +
examples/arm-cr/dpp_launchxl2-tms57012/dpp.h | 70 +-
examples/arm-cr/dpp_launchxl2-tms57012/dpp.qm | 12 +-
.../arm-cr/dpp_launchxl2-tms57012/philo.c | 113 +-
.../arm-cr/dpp_launchxl2-tms57012/qk/bsp.c | 6 +-
.../dpp_launchxl2-tms57012/qk/iar/dpp-qk.ewd | 8918 +++++-----
.../dpp_launchxl2-tms57012/qk/iar/dpp-qk.ewp | 6691 ++++----
.../dpp_launchxl2-tms57012/qk/iar/dpp-qk.eww | 20 +-
.../dpp_launchxl2-tms57012/qk/iar/dpp-qk.icf | 90 +-
.../dpp_launchxl2-tms57012/qk/ti/.cproject | 562 +-
.../dpp_launchxl2-tms57012/qk/ti/.project | 168 +-
.../arm-cr/dpp_launchxl2-tms57012/qv/bsp.c | 6 +-
.../dpp_launchxl2-tms57012/qv/iar/dpp-qv.ewd | 9800 +++++------
.../dpp_launchxl2-tms57012/qv/iar/dpp-qv.ewp | 6139 ++++---
.../dpp_launchxl2-tms57012/qv/iar/dpp-qv.eww | 20 +-
.../dpp_launchxl2-tms57012/qv/iar/dpp-qv.icf | 90 +-
.../dpp_launchxl2-tms57012/qv/ti/.cproject | 562 +-
.../dpp_launchxl2-tms57012/qv/ti/.project | 168 +-
.../qview/qview-dpp.bat | 16 +-
.../qview/qview-dpp1.bat | 16 +-
.../arm-cr/dpp_launchxl2-tms57012/table.c | 121 +-
.../embos/arm-cm/dpp_nucleo-h743zi/README.md | 5 +
examples/embos/arm-cm/dpp_nucleo-h743zi/bsp.c | 6 +-
examples/embos/arm-cm/dpp_nucleo-h743zi/dpp.h | 70 +-
.../embos/arm-cm/dpp_nucleo-h743zi/dpp.qm | 15 +-
.../arm-cm/dpp_nucleo-h743zi/gnu/Makefile | 5 +-
.../arm-cm/dpp_nucleo-h743zi/iar/dpp.ewp | 3 -
.../embos/arm-cm/dpp_nucleo-h743zi/philo.c | 106 +-
.../embos/arm-cm/dpp_nucleo-h743zi/table.c | 114 +-
examples/emwin/demo_no_wm/bsp.c | 2 +-
examples/emwin/demo_no_wm/demo_no_wm.sln | 48 +-
examples/emwin/demo_no_wm/demo_no_wm.vcxproj | 498 +-
.../demo_no_wm/demo_no_wm.vcxproj.filters | 158 +-
examples/emwin/demo_no_wm/philo.c | 2 +-
examples/emwin/demo_no_wm/table.c | 8 +-
examples/emwin/demo_with_wm/bsp.c | 2 +-
examples/emwin/demo_with_wm/demo_with_wm.sln | 48 +-
.../emwin/demo_with_wm/demo_with_wm.vcxproj | 498 +-
.../demo_with_wm/demo_with_wm.vcxproj.filters | 158 +-
examples/emwin/demo_with_wm/philo.c | 2 +-
examples/emwin/demo_with_wm/table.c | 8 +-
.../arm-cm/dpp_ek-tm4c123gxl/FreeRTOSConfig.h | 4 +-
.../arm-cm/dpp_ek-tm4c123gxl/README.md | 5 +
.../dpp_ek-tm4c123gxl/armclang/dpp.uvoptx | 1071 ++
.../dpp_ek-tm4c123gxl/armclang/dpp.uvprojx | 1928 +++
.../freertos/arm-cm/dpp_ek-tm4c123gxl/bsp.c | 12 +-
.../freertos/arm-cm/dpp_ek-tm4c123gxl/dpp.h | 70 +-
.../freertos/arm-cm/dpp_ek-tm4c123gxl/dpp.qm | 15 +-
.../arm-cm/dpp_ek-tm4c123gxl/gnu/Makefile | 9 +-
.../arm-cm/dpp_ek-tm4c123gxl/gnu/flash.bat | 64 +-
.../arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewd | 8426 ++++-----
.../arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewp | 6557 +++----
.../arm-cm/dpp_ek-tm4c123gxl/iar/dpp.eww | 20 +-
.../arm-cm/dpp_ek-tm4c123gxl/iar/dpp.icf | 56 +-
.../freertos/arm-cm/dpp_ek-tm4c123gxl/main.c | 13 +-
.../freertos/arm-cm/dpp_ek-tm4c123gxl/philo.c | 106 +-
.../freertos/arm-cm/dpp_ek-tm4c123gxl/table.c | 114 +-
.../arm-cm/dpp_nucleo-h743zi/FreeRTOSConfig.h | 4 +-
.../dpp_nucleo-h743zi/armclang/dpp.uvoptx | 1237 ++
.../dpp_nucleo-h743zi/armclang/dpp.uvprojx | 2141 +++
.../freertos/arm-cm/dpp_nucleo-h743zi/bsp.c | 8 +-
.../freertos/arm-cm/dpp_nucleo-h743zi/dpp.h | 70 +-
.../freertos/arm-cm/dpp_nucleo-h743zi/dpp.qm | 15 +-
.../arm-cm/dpp_nucleo-h743zi/gnu/Makefile | 9 +-
.../arm-cm/dpp_nucleo-h743zi/iar/dpp.ewd | 8426 ++++-----
.../arm-cm/dpp_nucleo-h743zi/iar/dpp.ewp | 6695 ++++----
.../arm-cm/dpp_nucleo-h743zi/iar/dpp.eww | 20 +-
.../arm-cm/dpp_nucleo-h743zi/iar/dpp.icf | 166 +-
.../freertos/arm-cm/dpp_nucleo-h743zi/philo.c | 106 +-
.../freertos/arm-cm/dpp_nucleo-h743zi/table.c | 114 +-
.../lwip/arm-cm/lwip_ek-lm3s6965/lwipmgr.c | 14 +-
examples/lwip/arm-cm/lwip_ek-lm3s6965/philo.c | 2 +-
.../lwip/arm-cm/lwip_ek-lm3s6965/qk/bsp.c | 6 +-
.../arm-cm/lwip_ek-lm3s6965/qk/gnu/Makefile | 5 +-
.../arm-cm/lwip_ek-lm3s6965/qk/gnu/flash.bat | 64 +-
.../lwip_ek-lm3s6965/qk/iar/lwip-qk.ewd | 8426 ++++-----
.../lwip_ek-lm3s6965/qk/iar/lwip-qk.ewp | 6484 +++----
.../lwip_ek-lm3s6965/qk/iar/lwip-qk.eww | 20 +-
.../lwip_ek-lm3s6965/qk/iar/lwip-qk.icf | 56 +-
.../lwip/arm-cm/lwip_ek-lm3s6965/qv/bsp.c | 6 +-
.../arm-cm/lwip_ek-lm3s6965/qv/gnu/Makefile | 5 +-
.../arm-cm/lwip_ek-lm3s6965/qv/gnu/flash.bat | 64 +-
.../lwip_ek-lm3s6965/qv/iar/lwip-qv.ewd | 8426 ++++-----
.../lwip_ek-lm3s6965/qv/iar/lwip-qv.ewp | 6490 +++----
.../lwip_ek-lm3s6965/qv/iar/lwip-qv.eww | 20 +-
.../lwip_ek-lm3s6965/qv/iar/lwip-qv.icf | 56 +-
examples/lwip/arm-cm/lwip_ek-lm3s6965/table.c | 6 +-
.../lwip/arm-cm/lwip_ek-lm3s6965/website.bat | 14 +-
.../lwip_ek-lm3s6965/website/ssi_demo.shtm | 192 +-
.../arm-cm/lwip_ek-lm3s6965/website/style.css | 4 +-
.../msp430/blinky_msp-exp430f5529lp/qk/bsp.c | 2 +-
.../qk/ccs-gnu/.cproject | 564 +-
.../qk/ccs-gnu/.project | 158 +-
.../qk/ccs-ti/.cproject | 644 +-
.../blinky-qk_msp-exp430f5529lp.launch | 32 +-
.../qk/ccs-ti/.project | 148 +-
.../qk/iar/blinky-qk.ewd | 2372 +--
.../qk/iar/blinky-qk.ewp | 7127 ++++----
.../qk/iar/blinky-qk.eww | 20 +-
.../msp430/blinky_msp-exp430f5529lp/qv/bsp.c | 2 +-
.../qv/ccs-gnu/.cproject | 564 +-
.../qv/ccs-gnu/.project | 158 +-
.../qv/ccs-ti/.cproject | 642 +-
.../qv/ccs-ti/.project | 158 +-
.../qv/iar/blinky-qv.ewd | 2372 +--
.../qv/iar/blinky-qv.ewp | 7113 ++++----
.../qv/iar/blinky-qv.eww | 20 +-
examples/msp430/dpp_msp-exp430f5529lp/dpp.h | 70 +-
examples/msp430/dpp_msp-exp430f5529lp/dpp.qm | 16 +-
examples/msp430/dpp_msp-exp430f5529lp/philo.c | 102 +-
.../msp430/dpp_msp-exp430f5529lp/qk/bsp.c | 2 +-
.../qk/ccs-gnu/.cproject | 564 +-
.../dpp_msp-exp430f5529lp/qk/ccs-gnu/.project | 168 +-
.../dpp_msp-exp430f5529lp/qk/ccs-ti/.cproject | 640 +-
.../dpp_msp-exp430f5529lp/qk/ccs-ti/.project | 168 +-
.../dpp_msp-exp430f5529lp/qk/iar/dpp-qk.ewd | 2372 +--
.../dpp_msp-exp430f5529lp/qk/iar/dpp-qk.ewp | 7133 ++++----
.../dpp_msp-exp430f5529lp/qk/iar/dpp-qk.eww | 20 +-
.../msp430/dpp_msp-exp430f5529lp/qv/bsp.c | 2 +-
.../qv/ccs-gnu/.cproject | 564 +-
.../dpp_msp-exp430f5529lp/qv/ccs-gnu/.project | 168 +-
.../dpp_msp-exp430f5529lp/qv/ccs-ti/.cproject | 640 +-
.../dpp_msp-exp430f5529lp/qv/ccs-ti/.project | 168 +-
.../dpp_msp-exp430f5529lp/qv/iar/dpp-qv.ewd | 2372 +--
.../dpp_msp-exp430f5529lp/qv/iar/dpp-qv.ewp | 7111 ++++----
.../dpp_msp-exp430f5529lp/qv/iar/dpp-qv.eww | 20 +-
examples/msp430/dpp_msp-exp430f5529lp/table.c | 114 +-
.../blinky_microstick2-pic32/qk/xc32/bsp.c | 2 +-
.../nbproject/Makefile-genesis.properties | 30 +-
.../qk/xc32/nbproject/configurations.xml | 1518 +-
.../xc32/nbproject/private/configurations.xml | 122 +-
.../qk/xc32/nbproject/private/private.xml | 16 +-
.../qk/xc32/nbproject/project.xml | 86 +-
.../blinky_microstick2-pic32/qv/xc32/bsp.c | 2 +-
.../nbproject/Makefile-genesis.properties | 30 +-
.../qv/xc32/nbproject/configurations.xml | 1516 +-
.../xc32/nbproject/private/configurations.xml | 122 +-
.../qv/xc32/nbproject/private/private.xml | 16 +-
.../qv/xc32/nbproject/project.xml | 82 +-
examples/pic32/dpp_microstick2-pic32/dpp.h | 70 +-
examples/pic32/dpp_microstick2-pic32/dpp.qm | 16 +-
examples/pic32/dpp_microstick2-pic32/philo.c | 102 +-
.../pic32/dpp_microstick2-pic32/qk/xc32/bsp.c | 2 +-
.../nbproject/Makefile-genesis.properties | 30 +-
.../qk/xc32/nbproject/configurations.xml | 1518 +-
.../xc32/nbproject/private/configurations.xml | 122 +-
.../qk/xc32/nbproject/private/private.xml | 20 +-
.../qk/xc32/nbproject/project.xml | 86 +-
.../pic32/dpp_microstick2-pic32/qv/xc32/bsp.c | 2 +-
.../nbproject/Makefile-genesis.properties | 30 +-
.../qv/xc32/nbproject/configurations.xml | 1512 +-
.../xc32/nbproject/private/configurations.xml | 122 +-
.../qv/xc32/nbproject/private/private.xml | 16 +-
.../qv/xc32/nbproject/project.xml | 82 +-
examples/pic32/dpp_microstick2-pic32/table.c | 114 +-
examples/qutest/blinky/blinky.qm | 4 +-
examples/qutest/blinky/src/blinky.c | 91 +-
examples/qutest/blinky/src/blinky.h | 45 +-
examples/qutest/blinky/test/Makefile | 6 +-
examples/qutest/blinky/test/make_efm32 | 5 +-
.../qutest/blinky/test/make_nucleo-l053r8 | 5 +-
examples/qutest/blinky/test/make_tm4c123 | 5 +-
examples/qutest/blinky/test/test_vc.sln | 36 +-
examples/qutest/blinky/test/test_vc.vcxproj | 320 +-
.../blinky/test/test_vc.vcxproj.filters | 24 +-
examples/qutest/dpp-comp/dpp-comp.qm | 2 +-
examples/qutest/dpp-comp/src/dpp.h | 85 +-
examples/qutest/dpp-comp/src/philo.c | 100 +-
examples/qutest/dpp-comp/src/table.c | 104 +-
examples/qutest/dpp-comp/test_dpp/Makefile | 6 +-
examples/qutest/dpp-comp/test_dpp/make_efm32 | 5 +-
.../dpp-comp/test_dpp/make_nucleo-l053r8 | 5 +-
examples/qutest/dpp-comp/test_dpp/make_posix | 6 +-
.../qutest/dpp-comp/test_dpp/make_tm4c123 | 5 +-
examples/qutest/dpp-comp/test_philo/Makefile | 6 +-
examples/qutest/dpp-comp/test_table/Makefile | 6 +-
.../qutest/dpp-comp/test_table/make_tm4c123 | 5 +-
examples/qutest/dpp/dpp.qm | 15 +-
examples/qutest/dpp/src/dpp.h | 48 +-
examples/qutest/dpp/src/philo.c | 107 +-
examples/qutest/dpp/src/table.c | 113 +-
examples/qutest/dpp/test_dpp/Makefile | 6 +-
examples/qutest/dpp/test_dpp/make_efm32 | 5 +-
.../qutest/dpp/test_dpp/make_nucleo-l053r8 | 5 +-
examples/qutest/dpp/test_dpp/make_posix | 6 +-
examples/qutest/dpp/test_dpp/make_tm4c123 | 5 +-
examples/qutest/dpp/test_philo/Makefile | 6 +-
examples/qutest/dpp/test_philo/test_vc.sln | 36 +-
.../qutest/dpp/test_philo/test_vc.vcxproj | 320 +-
.../dpp/test_philo/test_vc.vcxproj.filters | 24 +-
examples/qutest/dpp/test_table/Makefile | 6 +-
examples/qutest/dpp/test_table/make_tm4c123 | 5 +-
examples/qutest/evt_par/test/Makefile | 6 +-
examples/qutest/evt_par/test/make_tm4c123 | 5 +-
examples/qutest/qhsmtst/qhsmtst.qm | 2 +-
examples/qutest/qhsmtst/src/qhsmtst.c | 167 +-
examples/qutest/qhsmtst/src/qhsmtst.h | 40 +-
examples/qutest/qhsmtst/test/Makefile | 6 +-
examples/qutest/qhsmtst/test/make_efm32 | 5 +-
.../qutest/qhsmtst/test/make_nucleo-l053r8 | 5 +-
examples/qutest/qhsmtst/test/make_tm4c123 | 5 +-
examples/qutest/qmsmtst/qmsmtst.qm | 4 +-
examples/qutest/qmsmtst/src/qmsmtst.c | 196 +-
examples/qutest/qmsmtst/src/qmsmtst.h | 49 +-
examples/qutest/qmsmtst/test/Makefile | 6 +-
examples/qutest/qmsmtst/test/make_efm32 | 5 +-
.../qutest/qmsmtst/test/make_nucleo-l053r8 | 5 +-
examples/qutest/qmsmtst/test/make_tm4c123 | 5 +-
examples/qutest/self_test/test/Makefile | 6 +-
examples/qutest/self_test/test/make_efm32 | 5 +-
.../qutest/self_test/test/make_nucleo-l053r8 | 5 +-
examples/qutest/self_test/test/make_posix | 6 +-
examples/qutest/self_test/test/make_tm4c123 | 5 +-
examples/qutest/target_efm32/flash.bat | 96 +-
examples/qutest/target_efm32/test.icf | 56 +-
examples/qutest/unity_basic/README.txt | 86 +
.../qutest/unity_basic/src/ProductionCode.c | 24 +
.../qutest/unity_basic/src/ProductionCode.h | 3 +
examples/qutest/unity_basic/test/Makefile | 273 +
examples/qutest/unity_basic/test/make_efm32 | 321 +
examples/qutest/unity_basic/test/make_tm4c123 | 319 +
.../unity_basic/test/test_ProductionCode.c | 119 +
.../unity_basic/test/test_ProductionCode.py | 63 +
.../qutest/unity_basic/test_unity/Makefile | 232 +
.../test_unity/TestProductionCode.c | 62 +
.../test_unity/TestProductionCode_Runner.c | 57 +
examples/qutest/unity_ledbar/qutest/Makefile | 6 +-
.../qutest/unity_ledbar/qutest/make_efm32 | 5 +-
.../unity_ledbar/qutest/make_nucleo-l053r8 | 5 +-
.../qutest/unity_ledbar/qutest/make_tm4c123 | 5 +-
examples/qutest/unity_ledbar/trace/Makefile | 2 +-
examples/qutest/unity_ledbar2/qutest/Makefile | 6 +-
.../unity_ledbar2/qutest/make_nucleo-l053r8 | 5 +-
examples/qutest/unity_mock/README.txt | 126 +
examples/qutest/unity_mock/src/Led.h | 12 +
examples/qutest/unity_mock/src/LedBar.c | 41 +
examples/qutest/unity_mock/src/LedBar.h | 9 +
examples/qutest/unity_mock/test/Makefile | 274 +
examples/qutest/unity_mock/test/make_efm32 | 322 +
examples/qutest/unity_mock/test/make_tm4c123 | 320 +
examples/qutest/unity_mock/test/spy_Led.c | 82 +
examples/qutest/unity_mock/test/test_LedBar.c | 107 +
.../qutest/unity_mock/test/test_LedBar.py | 72 +
.../qutest/unity_mock/test_unity/Makefile | 236 +
.../qutest/unity_mock/test_unity/MockLed.c | 123 +
.../qutest/unity_mock/test_unity/MockLed.h | 38 +
.../qutest/unity_mock/test_unity/TestLedBar.c | 87 +
.../unity_mock/test_unity/TestLedBar_Runner.c | 107 +
.../unity_mock/test_unity/cmock/cmock.c | 210 +
.../unity_mock/test_unity/cmock/cmock.h | 38 +
.../test_unity/cmock/cmock_internals.h | 89 +
examples/qutest/unity_strlen/qutest/Makefile | 6 +-
.../qutest/unity_strlen/qutest/make_efm32 | 5 +-
.../unity_strlen/qutest/make_nucleo-l053r8 | 5 +-
.../qutest/unity_strlen/qutest/make_tm4c123 | 5 +-
.../threadx/arm-cm/dpp_ek-tm4c123gxl/bsp.c | 10 +-
.../threadx/arm-cm/dpp_ek-tm4c123gxl/dpp.h | 66 +-
.../threadx/arm-cm/dpp_ek-tm4c123gxl/dpp.qm | 15 +-
.../arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewd | 8426 ++++-----
.../arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewp | 7544 ++++----
.../arm-cm/dpp_ek-tm4c123gxl/iar/dpp.eww | 20 +-
.../arm-cm/dpp_ek-tm4c123gxl/iar/dpp.icf | 56 +-
.../threadx/arm-cm/dpp_ek-tm4c123gxl/philo.c | 112 +-
.../threadx/arm-cm/dpp_ek-tm4c123gxl/table.c | 118 +-
.../arm-cm/dpp_stm32f429-discovery/bsp.c | 10 +-
.../arm-cm/dpp_stm32f429-discovery/dpp.h | 66 +-
.../arm-cm/dpp_stm32f429-discovery/dpp.qm | 15 +-
.../dpp_stm32f429-discovery/iar/dpp.ewd | 8426 ++++-----
.../dpp_stm32f429-discovery/iar/dpp.ewp | 7575 ++++-----
.../dpp_stm32f429-discovery/iar/dpp.eww | 20 +-
.../dpp_stm32f429-discovery/iar/dpp.icf | 60 +-
.../arm-cm/dpp_stm32f429-discovery/philo.c | 112 +-
.../arm-cm/dpp_stm32f429-discovery/table.c | 118 +-
examples/threadx/win32/dpp_console/bsp.c | 14 +-
examples/threadx/win32/dpp_console/dpp.h | 66 +-
examples/threadx/win32/dpp_console/dpp.qm | 15 +-
examples/threadx/win32/dpp_console/philo.c | 108 +-
examples/threadx/win32/dpp_console/table.c | 114 +-
.../dpp_ek-tm4c123gxl/armclang/dpp.uvoptx | 6 +-
.../dpp_ek-tm4c123gxl/armclang/dpp.uvprojx | 12 +-
.../uc-os2/arm-cm/dpp_ek-tm4c123gxl/bsp.c | 6 +-
.../uc-os2/arm-cm/dpp_ek-tm4c123gxl/dpp.h | 70 +-
.../uc-os2/arm-cm/dpp_ek-tm4c123gxl/dpp.qm | 15 +-
.../arm-cm/dpp_ek-tm4c123gxl/gnu/Makefile | 5 +-
.../arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewp | 3 -
.../uc-os2/arm-cm/dpp_ek-tm4c123gxl/philo.c | 106 +-
.../uc-os2/arm-cm/dpp_ek-tm4c123gxl/table.c | 114 +-
.../dpp_nucleo-l053r8/armclang/dpp.uvprojx | 6 +-
.../uc-os2/arm-cm/dpp_nucleo-l053r8/bsp.c | 6 +-
.../uc-os2/arm-cm/dpp_nucleo-l053r8/dpp.h | 70 +-
.../uc-os2/arm-cm/dpp_nucleo-l053r8/dpp.qm | 15 +-
.../arm-cm/dpp_nucleo-l053r8/gnu/Makefile | 5 +-
.../arm-cm/dpp_nucleo-l053r8/iar/dpp.ewp | 3 -
.../uc-os2/arm-cm/dpp_nucleo-l053r8/philo.c | 106 +-
.../uc-os2/arm-cm/dpp_nucleo-l053r8/table.c | 114 +-
examples/workstation/blinky/Makefile | 6 +-
examples/workstation/blinky/blinky.c | 79 +-
examples/workstation/blinky/blinky.qm | 15 +-
examples/workstation/calc/Makefile | 6 +-
examples/workstation/calc/calc.c | 296 +-
examples/workstation/calc/calc.h | 47 +-
examples/workstation/calc/calc.qm | 2 +-
examples/workstation/calc/calc.sln | 50 +-
examples/workstation/calc/calc.vcxproj | 320 +-
.../workstation/calc/calc.vcxproj.filters | 24 +-
examples/workstation/calc1/Makefile | 6 +-
examples/workstation/calc1/calc1.c | 317 +-
examples/workstation/calc1/calc1.h | 47 +-
examples/workstation/calc1/calc1.qm | 3 +-
examples/workstation/calc1_sub/Makefile | 6 +-
examples/workstation/calc1_sub/calc1_sub.c | 313 +-
examples/workstation/calc1_sub/calc1_sub.h | 56 +-
examples/workstation/calc1_sub/calc1_sub.qm | 4 +-
.../workstation/calc1_sub/lint-plus/lin.bat | 128 +-
examples/workstation/calc2/Makefile | 6 +-
examples/workstation/calc2/calc2.c | 250 +-
examples/workstation/calc2/calc2.h | 47 +-
examples/workstation/calc2/calc2.qm | 3 +-
examples/workstation/comp/.comp | 59 +
examples/workstation/comp/Makefile | 6 +-
examples/workstation/comp/alarm.c | 86 +-
examples/workstation/comp/alarm.h | 44 +-
examples/workstation/comp/bsp.c | 2 +-
examples/workstation/comp/clock.c | 117 +-
examples/workstation/comp/clock.h | 60 +-
examples/workstation/comp/comp.qm | 6 +-
examples/workstation/defer/Makefile | 6 +-
examples/workstation/defer/bsp.c | 2 +-
examples/workstation/defer/defer.c | 113 +-
examples/workstation/defer/defer.qm | 6 +-
.../workstation/defer/qspy200822_125414.seq | 138 +-
examples/workstation/dpp-comp/Makefile | 6 +-
examples/workstation/dpp-comp/bsp.c | 6 +-
examples/workstation/dpp-comp/dpp-comp.qm | 3 +-
examples/workstation/dpp-comp/dpp.h | 85 +-
examples/workstation/dpp-comp/philo.c | 100 +-
examples/workstation/dpp-comp/table.c | 104 +-
examples/workstation/dpp/Makefile | 6 +-
examples/workstation/dpp/bsp.c | 6 +-
examples/workstation/dpp/dpp.h | 48 +-
examples/workstation/dpp/dpp.qm | 15 +-
examples/workstation/dpp/dpp.sln | 84 +-
examples/workstation/dpp/dpp.vcxproj | 728 +-
examples/workstation/dpp/dpp.vcxproj.filters | 26 +-
examples/workstation/dpp/philo.c | 107 +-
examples/workstation/dpp/qview/qview-dpp.bat | 16 +-
examples/workstation/dpp/qview/qview-dpp1.bat | 16 +-
examples/workstation/dpp/table.c | 113 +-
examples/workstation/history_qhsm/Makefile | 6 +-
examples/workstation/history_qhsm/history.c | 126 +-
examples/workstation/history_qhsm/history.h | 40 +-
examples/workstation/history_qhsm/history.qm | 4 +-
examples/workstation/history_qmsm/Makefile | 6 +-
examples/workstation/history_qmsm/history.c | 153 +-
examples/workstation/history_qmsm/history.h | 49 +-
examples/workstation/history_qmsm/history.qm | 6 +-
examples/workstation/qhsmtst/Makefile | 6 +-
examples/workstation/qhsmtst/log.txt | 2 +-
examples/workstation/qhsmtst/log1.txt | 23 +
examples/workstation/qhsmtst/qhsmtst.c | 164 +-
examples/workstation/qhsmtst/qhsmtst.h | 40 +-
examples/workstation/qhsmtst/qhsmtst.qm | 2 +-
examples/workstation/qhsmtst/qhsmtst.sln | 50 +-
examples/workstation/qhsmtst/qhsmtst.vcxproj | 316 +-
.../qhsmtst/qhsmtst.vcxproj.filters | 20 +-
examples/workstation/qmsmtst/Makefile | 6 +-
examples/workstation/qmsmtst/qmsmtst.c | 193 +-
examples/workstation/qmsmtst/qmsmtst.h | 49 +-
examples/workstation/qmsmtst/qmsmtst.qm | 4 +-
examples/workstation/reminder/Makefile | 6 +-
examples/workstation/reminder/bsp.c | 2 +-
examples/workstation/reminder2/Makefile | 6 +-
examples/workstation/reminder2/bsp.c | 2 +-
examples/workstation/reminder2/reminder2.c | 92 +-
examples/workstation/reminder2/reminder2.qm | 6 +-
examples/zephyr/blinky/CMakeLists.txt | 42 +
examples/zephyr/blinky/README.md | 52 +
examples/zephyr/blinky/prj.conf | 7 +
examples/zephyr/blinky/src/blinky.c | 111 +
examples/zephyr/blinky/src/blinky.h | 48 +
examples/zephyr/blinky/src/bsp.c | 75 +
examples/zephyr/blinky/src/bsp.h | 52 +
examples/zephyr/blinky/src/main.c | 66 +
examples/zephyr/dpp/CMakeLists.txt | 60 +
examples/zephyr/dpp/README.md | 52 +
examples/zephyr/dpp/dpp.qm | 487 +
examples/zephyr/dpp/prj.conf | 7 +
examples/zephyr/dpp/src/bsp.c | 269 +
examples/zephyr/dpp/src/bsp.h | 54 +
examples/zephyr/dpp/src/dpp.h | 92 +
examples/zephyr/dpp/src/main.c | 87 +
examples/zephyr/dpp/src/philo.c | 253 +
examples/zephyr/dpp/src/table.c | 324 +
include/qassert.h | 617 +-
include/qep.h | 1529 +-
include/qequeue.h | 235 +-
include/qf.h | 2285 ++-
include/qf_pkg.h | 196 +
include/qk.h | 322 +-
include/qmpool.h | 218 +-
include/qpc.h | 33 +-
include/qs.h | 1960 ++-
include/qs_dummy.h | 25 +-
include/qs_pkg.h | 275 +
include/qstamp.c | 27 +-
include/qstamp.h | 25 +-
include/qv.h | 130 +-
include/qxk.h | 1048 +-
ports/arm-cm/qk/armclang/qep_port.h | 2 -
ports/arm-cm/qk/armclang/qk_port.c | 68 +-
ports/arm-cm/qk/armclang/qk_port.h | 17 +-
ports/arm-cm/qk/armclang/qs_port.h | 25 +-
ports/arm-cm/qk/gnu/qep_port.h | 1 -
ports/arm-cm/qk/gnu/qk_port.c | 64 +-
ports/arm-cm/qk/gnu/qk_port.h | 15 +-
ports/arm-cm/qk/gnu/qs_port.h | 25 +-
ports/arm-cm/qk/iar/qep_port.h | 3 +-
ports/arm-cm/qk/iar/qf_port.h | 2 +-
ports/arm-cm/qk/iar/qk_port.c | 77 +-
ports/arm-cm/qk/iar/qk_port.h | 17 +-
ports/arm-cm/qk/iar/qs_port.h | 25 +-
ports/arm-cm/qutest/qep_port.h | 3 +-
ports/arm-cm/qutest/qf_port.h | 12 +-
ports/arm-cm/qutest/qs_port.h | 28 +-
ports/arm-cm/qv/armclang/qep_port.h | 3 +-
ports/arm-cm/qv/armclang/qf_port.h | 2 +-
ports/arm-cm/qv/armclang/qs_port.h | 25 +-
ports/arm-cm/qv/armclang/qv_port.c | 14 +-
ports/arm-cm/qv/armclang/qv_port.h | 2 +-
ports/arm-cm/qv/gnu/qep_port.h | 3 +-
ports/arm-cm/qv/gnu/qf_port.h | 2 +-
ports/arm-cm/qv/gnu/qs_port.h | 25 +-
ports/arm-cm/qv/gnu/qv_port.c | 14 +-
ports/arm-cm/qv/gnu/qv_port.h | 2 +-
ports/arm-cm/qv/iar/qep_port.h | 52 +-
ports/arm-cm/qv/iar/qf_port.h | 51 +-
ports/arm-cm/qv/iar/qs_port.h | 25 +-
ports/arm-cm/qv/iar/qv_port.c | 67 +-
ports/arm-cm/qv/iar/qv_port.h | 51 +-
ports/arm-cm/qxk/armclang/qep_port.h | 3 +-
ports/arm-cm/qxk/armclang/qf_port.h | 8 +-
ports/arm-cm/qxk/armclang/qs_port.h | 25 +-
ports/arm-cm/qxk/armclang/qxk_port.c | 67 +-
ports/arm-cm/qxk/armclang/qxk_port.h | 19 +-
ports/arm-cm/qxk/gnu/qep_port.h | 3 +-
ports/arm-cm/qxk/gnu/qf_port.h | 8 +-
ports/arm-cm/qxk/gnu/qs_port.h | 25 +-
ports/arm-cm/qxk/gnu/qxk_port.c | 67 +-
ports/arm-cm/qxk/gnu/qxk_port.h | 19 +-
ports/arm-cm/qxk/iar/qep_port.h | 3 +-
ports/arm-cm/qxk/iar/qf_port.h | 8 +-
ports/arm-cm/qxk/iar/qs_port.h | 25 +-
ports/arm-cm/qxk/iar/qxk_port.c | 73 +-
ports/arm-cm/qxk/iar/qxk_port.h | 17 +-
ports/arm-cm/qxk/llvm/README.txt | 2 +-
ports/arm-cr/qk/gnu/qep_port.h | 51 +-
ports/arm-cr/qk/gnu/qf_port.h | 50 +-
ports/arm-cr/qk/gnu/qk_port.h | 63 +-
ports/arm-cr/qk/gnu/qs_port.h | 62 +-
ports/arm-cr/qk/iar/qep_port.h | 52 +-
ports/arm-cr/qk/iar/qf_port.h | 51 +-
ports/arm-cr/qk/iar/qk_port.h | 63 +-
ports/arm-cr/qk/iar/qs_port.h | 62 +-
ports/arm-cr/qk/ti/qep_port.h | 52 +-
ports/arm-cr/qk/ti/qf_port.h | 51 +-
ports/arm-cr/qk/ti/qk_port.h | 57 +-
ports/arm-cr/qk/ti/qs_port.h | 62 +-
ports/arm-cr/qv/gnu/qep_port.h | 52 +-
ports/arm-cr/qv/gnu/qf_port.h | 51 +-
ports/arm-cr/qv/gnu/qs_port.h | 62 +-
ports/arm-cr/qv/gnu/qv_port.h | 51 +-
ports/arm-cr/qv/iar/qep_port.h | 52 +-
ports/arm-cr/qv/iar/qf_port.h | 51 +-
ports/arm-cr/qv/iar/qs_port.h | 62 +-
ports/arm-cr/qv/iar/qv_port.h | 51 +-
ports/arm-cr/qv/ti/qep_port.h | 52 +-
ports/arm-cr/qv/ti/qf_port.h | 51 +-
ports/arm-cr/qv/ti/qs_port.h | 62 +-
ports/arm-cr/qv/ti/qv_port.h | 51 +-
ports/embos/qep_port.h | 54 +-
ports/embos/qf_port.c | 59 +-
ports/embos/qf_port.h | 58 +-
ports/embos/qs_port.h | 62 +-
ports/freertos/qep_port.h | 52 +-
ports/freertos/qf_port.c | 381 +-
ports/freertos/qf_port.h | 189 +-
ports/freertos/qs_port.h | 64 +-
ports/lint-plus/16bit/qs_port.h | 55 +-
ports/lint-plus/32bit/qs_port.h | 59 +-
ports/lint-plus/lin.bat | 138 +-
ports/lint-plus/options.lnt | 8 +-
ports/lint-plus/qep_port.h | 52 +-
ports/lint-plus/qk/qf_port.h | 56 +-
ports/lint-plus/qk/qk_port.h | 68 +-
ports/lint-plus/qpc.lnt | 13 +-
ports/lint-plus/qv/qf_port.h | 55 +-
ports/lint-plus/qv/qv_port.h | 52 +-
ports/lint-plus/qxk/qf_port.h | 244 +-
ports/lint-plus/qxk/qxk_port.h | 46 +-
ports/msp430/qk/qep_port.h | 63 +-
ports/msp430/qk/qf_port.h | 67 +-
ports/msp430/qk/qk_port.h | 58 +-
ports/msp430/qk/qs_port.h | 71 +-
ports/msp430/qutest/qep_port.h | 63 +-
ports/msp430/qutest/qf_port.h | 60 +-
ports/msp430/qutest/qs_port.h | 71 +-
ports/msp430/qv/qep_port.h | 63 +-
ports/msp430/qv/qf_port.h | 51 +-
ports/msp430/qv/qs_port.h | 71 +-
ports/msp430/qv/qv_port.h | 52 +-
ports/pic32/qk/xc32/qep_port.h | 63 +-
ports/pic32/qk/xc32/qf_port.h | 63 +-
ports/pic32/qk/xc32/qk_port.c | 63 +-
ports/pic32/qk/xc32/qk_port.h | 72 +-
ports/pic32/qk/xc32/qs_port.h | 75 +-
ports/pic32/qutest/xc32/qep_port.h | 63 +-
ports/pic32/qutest/xc32/qf_port.h | 60 +-
ports/pic32/qutest/xc32/qs_port.h | 71 +-
ports/pic32/qv/xc32/qep_port.h | 63 +-
ports/pic32/qv/xc32/qf_port.h | 63 +-
ports/pic32/qv/xc32/qs_port.h | 75 +-
ports/pic32/qv/xc32/qv_port.h | 63 +-
ports/posix-qutest/qep_port.h | 63 +-
ports/posix-qutest/qf_port.h | 57 +-
ports/posix-qutest/qs_port.h | 68 +-
ports/posix-qutest/qutest_port.c | 63 +-
ports/posix-qutest/safe_std.h | 52 +-
ports/posix-qv/qep_port.h | 63 +-
ports/posix-qv/qf_port.c | 25 +-
ports/posix-qv/qf_port.h | 57 +-
ports/posix-qv/qs_port.c | 63 +-
ports/posix-qv/qs_port.h | 71 +-
ports/posix-qv/safe_std.h | 52 +-
ports/posix/qep_port.h | 63 +-
ports/posix/qf_port.c | 69 +-
ports/posix/qf_port.h | 53 +-
ports/posix/qs_port.c | 63 +-
ports/posix/qs_port.h | 70 +-
ports/posix/safe_std.h | 52 +-
ports/threadx/qep_port.h | 63 +-
ports/threadx/qf_port.c | 70 +-
ports/threadx/qf_port.h | 66 +-
ports/threadx/qs_port.h | 68 +-
ports/uc-os2/qep_port.h | 2 +-
ports/uc-os2/qf_port.c | 28 +-
ports/uc-os2/qf_port.h | 2 +-
ports/uc-os2/qs_port.h | 25 +-
ports/win32-quit/qep_port.h | 51 +-
ports/win32-quit/qf_port.h | 72 +-
ports/win32-quit/qs_port.h | 84 +-
ports/win32-quit/quit_port.c | 56 +-
ports/win32-qutest/Makefile | 1 -
ports/win32-qutest/qep_port.h | 51 +-
ports/win32-qutest/qf_port.h | 69 +-
ports/win32-qutest/qp.sln | 60 +-
ports/win32-qutest/qp.vcxproj | 416 +-
ports/win32-qutest/qp.vcxproj.filters | 154 +-
ports/win32-qutest/qs_port.h | 72 +-
ports/win32-qutest/qutest_port.c | 63 +-
ports/win32-qutest/safe_std.h | 52 +-
ports/win32-qv/Makefile | 1 -
ports/win32-qv/qep_port.h | 51 +-
ports/win32-qv/qf_port.c | 80 +-
ports/win32-qv/qf_port.h | 66 +-
ports/win32-qv/qp.sln | 84 +-
ports/win32-qv/qp.vcxproj | 806 +-
ports/win32-qv/qp.vcxproj.filters | 178 +-
ports/win32-qv/qs_port.c | 63 +-
ports/win32-qv/qs_port.h | 66 +-
ports/win32-qv/qwin_gui.c | 51 +-
ports/win32-qv/qwin_gui.h | 51 +-
ports/win32-qv/safe_std.h | 52 +-
ports/win32/Makefile | 1 -
ports/win32/qep_port.h | 64 +-
ports/win32/qf_port.c | 69 +-
ports/win32/qf_port.h | 65 +-
ports/win32/qp.sln | 84 +-
ports/win32/qp.vcxproj | 804 +-
ports/win32/qp.vcxproj.filters | 178 +-
ports/win32/qs_port.c | 63 +-
ports/win32/qs_port.h | 66 +-
ports/win32/qwin_gui.c | 51 +-
ports/win32/qwin_gui.h | 51 +-
ports/win32/safe_std.h | 52 +-
ports/zephyr/README.md | 3 +
qpc.qm | 14202 ++++++++++++++++
src/qf/qep_hsm.c | 499 +-
src/qf/qep_msm.c | 486 +-
src/qf/qf_act.c | 176 +-
src/qf/qf_actq.c | 309 +-
src/qf/qf_defer.c | 123 +-
src/qf/qf_dyn.c | 266 +-
src/qf/qf_mem.c | 218 +-
src/qf/qf_ps.c | 242 +-
src/qf/qf_qact.c | 179 +-
src/qf/qf_qeq.c | 159 +-
src/qf/qf_qmact.c | 67 +-
src/qf/qf_time.c | 576 +-
src/qk/qk.c | 566 +-
src/qs/qs.c | 1117 +-
src/qs/qs_64bit.c | 59 +-
src/qs/qs_fp.c | 82 +-
src/qs/qs_rx.c | 878 +-
src/qs/qutest.c | 459 +-
src/qv/qv.c | 173 +-
src/qxk/qxk.c | 757 +-
src/qxk/qxk_mutex.c | 207 +-
src/qxk/qxk_sema.c | 144 +-
src/qxk/qxk_xthr.c | 710 +-
zephyr/CMakeLists.txt | 52 +
zephyr/Kconfig | 21 +
zephyr/README.md | 26 +
zephyr/module.yml | 3 +
zephyr/qep_port.h | 40 +
zephyr/qf_port.c | 236 +
zephyr/qf_port.h | 94 +
zephyr/qs_port.h | 60 +
1022 files changed, 379138 insertions(+), 345906 deletions(-)
create mode 100644 .gitmodules
create mode 160000 3rd_party
create mode 100644 LICENSES/LicenseRef-QL-dual.qlc
create mode 100644 LICENSES/QM-EVAL-QPC.qlc
create mode 100644 LICENSES/QP-Arduino_GPL_Exception.txt
create mode 100644 LICENSES/QP-RasPi_GPL_Exception.txt
create mode 100644 LICENSES/QP-mbed_GPL_Exception.txt
create mode 100644 doxygen/DoxygenLayout.xml
create mode 100644 doxygen/config.h
create mode 100644 doxygen/images/an-oop_in_c.jpg
create mode 100644 doxygen/images/github-star.jpg
create mode 100644 doxygen/images/logo_embos.png
create mode 100644 doxygen/images/logo_freertos.png
create mode 100644 doxygen/images/logo_pclintplus.jpg
create mode 100644 doxygen/images/logo_threadx.jpg
create mode 100644 doxygen/images/logo_uc-os2.jpg
create mode 100644 doxygen/images/logo_zephyr.jpg
create mode 100644 doxygen/img/cert-pack.png
create mode 100644 doxygen/modules-unused.dox
create mode 100644 doxygen/snippets/qf_tevt.c
create mode 100644 doxygen/snippets/qs_objArrDic.c
create mode 100644 examples/arm-cm/blinky_efm32-slstk3401a/README.md
create mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/README.md
create mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/README.md
create mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/README.md
create mode 100644 examples/arm-cm/dpp_mbed-lpc1768/README.md
create mode 100644 examples/arm-cm/dpp_nucleo-h743zi/README.md
create mode 100644 examples/arm-cm/dpp_nucleo-l053r8/README.md
create mode 100644 examples/arm-cm/dpp_stm32f4-discovery/README.md
create mode 100644 examples/arm-cm/game_efm32-slstk3401a/README.md
create mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/README.md
create mode 100644 examples/arm-cr/blinky_launchxl2-tms57012/README.md
create mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/README.md
create mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/README.md
create mode 100644 examples/freertos/arm-cm/dpp_ek-tm4c123gxl/README.md
create mode 100644 examples/freertos/arm-cm/dpp_ek-tm4c123gxl/armclang/dpp.uvoptx
create mode 100644 examples/freertos/arm-cm/dpp_ek-tm4c123gxl/armclang/dpp.uvprojx
create mode 100644 examples/freertos/arm-cm/dpp_nucleo-h743zi/armclang/dpp.uvoptx
create mode 100644 examples/freertos/arm-cm/dpp_nucleo-h743zi/armclang/dpp.uvprojx
create mode 100644 examples/qutest/unity_basic/README.txt
create mode 100644 examples/qutest/unity_basic/src/ProductionCode.c
create mode 100644 examples/qutest/unity_basic/src/ProductionCode.h
create mode 100644 examples/qutest/unity_basic/test/Makefile
create mode 100644 examples/qutest/unity_basic/test/make_efm32
create mode 100644 examples/qutest/unity_basic/test/make_tm4c123
create mode 100644 examples/qutest/unity_basic/test/test_ProductionCode.c
create mode 100644 examples/qutest/unity_basic/test/test_ProductionCode.py
create mode 100644 examples/qutest/unity_basic/test_unity/Makefile
create mode 100644 examples/qutest/unity_basic/test_unity/TestProductionCode.c
create mode 100644 examples/qutest/unity_basic/test_unity/TestProductionCode_Runner.c
create mode 100644 examples/qutest/unity_mock/README.txt
create mode 100644 examples/qutest/unity_mock/src/Led.h
create mode 100644 examples/qutest/unity_mock/src/LedBar.c
create mode 100644 examples/qutest/unity_mock/src/LedBar.h
create mode 100644 examples/qutest/unity_mock/test/Makefile
create mode 100644 examples/qutest/unity_mock/test/make_efm32
create mode 100644 examples/qutest/unity_mock/test/make_tm4c123
create mode 100644 examples/qutest/unity_mock/test/spy_Led.c
create mode 100644 examples/qutest/unity_mock/test/test_LedBar.c
create mode 100644 examples/qutest/unity_mock/test/test_LedBar.py
create mode 100644 examples/qutest/unity_mock/test_unity/Makefile
create mode 100644 examples/qutest/unity_mock/test_unity/MockLed.c
create mode 100644 examples/qutest/unity_mock/test_unity/MockLed.h
create mode 100644 examples/qutest/unity_mock/test_unity/TestLedBar.c
create mode 100644 examples/qutest/unity_mock/test_unity/TestLedBar_Runner.c
create mode 100644 examples/qutest/unity_mock/test_unity/cmock/cmock.c
create mode 100644 examples/qutest/unity_mock/test_unity/cmock/cmock.h
create mode 100644 examples/qutest/unity_mock/test_unity/cmock/cmock_internals.h
create mode 100644 examples/workstation/comp/.comp
create mode 100644 examples/workstation/qhsmtst/log1.txt
create mode 100644 examples/zephyr/blinky/CMakeLists.txt
create mode 100644 examples/zephyr/blinky/README.md
create mode 100644 examples/zephyr/blinky/prj.conf
create mode 100644 examples/zephyr/blinky/src/blinky.c
create mode 100644 examples/zephyr/blinky/src/blinky.h
create mode 100644 examples/zephyr/blinky/src/bsp.c
create mode 100644 examples/zephyr/blinky/src/bsp.h
create mode 100644 examples/zephyr/blinky/src/main.c
create mode 100644 examples/zephyr/dpp/CMakeLists.txt
create mode 100644 examples/zephyr/dpp/README.md
create mode 100644 examples/zephyr/dpp/dpp.qm
create mode 100644 examples/zephyr/dpp/prj.conf
create mode 100644 examples/zephyr/dpp/src/bsp.c
create mode 100644 examples/zephyr/dpp/src/bsp.h
create mode 100644 examples/zephyr/dpp/src/dpp.h
create mode 100644 examples/zephyr/dpp/src/main.c
create mode 100644 examples/zephyr/dpp/src/philo.c
create mode 100644 examples/zephyr/dpp/src/table.c
create mode 100644 include/qf_pkg.h
create mode 100644 include/qs_pkg.h
create mode 100644 ports/zephyr/README.md
create mode 100644 qpc.qm
create mode 100644 zephyr/CMakeLists.txt
create mode 100644 zephyr/Kconfig
create mode 100644 zephyr/README.md
create mode 100644 zephyr/module.yml
create mode 100644 zephyr/qep_port.h
create mode 100644 zephyr/qf_port.c
create mode 100644 zephyr/qf_port.h
create mode 100644 zephyr/qs_port.h
diff --git a/.gitignore b/.gitignore
index 820b6b45..33a5e3e3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -32,12 +32,11 @@
*.Debug
*.Release
*.bak
-*.qlc
JLink*.*
version-*
-3rd_party/
html/
+cert-pack/
test_priv/
dbg/
rel/
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 00000000..8c45f353
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "3rd_party"]
+ path = 3rd_party
+ url = https://github.com/QuantumLeaps/3rd_party.git
diff --git a/3rd_party b/3rd_party
new file mode 160000
index 00000000..8a2ebb9e
--- /dev/null
+++ b/3rd_party
@@ -0,0 +1 @@
+Subproject commit 8a2ebb9e76a63a2f46b8ad906657154ab21a15e8
diff --git a/LICENSES/LicenseRef-QL-dual.qlc b/LICENSES/LicenseRef-QL-dual.qlc
new file mode 100644
index 00000000..a5df1c2b
--- /dev/null
+++ b/LICENSES/LicenseRef-QL-dual.qlc
@@ -0,0 +1,26 @@
+Any user of the QP/C real-time embedded framework
+qpc
+2023-12-31
+
+Copyright (C) 2005 Quantum Leaps, LLC .
+
+SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-QL-commercial
+
+This software is dual-licensed under the terms of the open source GNU
+General Public License version 3 (or any later version), or alternatively,
+under the terms of one of the closed source Quantum Leaps commercial
+licenses.
+
+The terms of the open source GNU General Public License version 3
+can be found at:
+
+The terms of the closed source Quantum Leaps commercial licenses
+can be found at:
+
+Redistributions in source code must retain this top-level comment block.
+Plagiarizing this software to sidestep the license obligations is illegal.
+
+Contact information:
+
+
+#F04C7A28E6F84BAFDD11A028A9B7CFE2F4DE1FD7
\ No newline at end of file
diff --git a/LICENSES/QM-EVAL-QPC.qlc b/LICENSES/QM-EVAL-QPC.qlc
new file mode 100644
index 00000000..9a0423a0
--- /dev/null
+++ b/LICENSES/QM-EVAL-QPC.qlc
@@ -0,0 +1,25 @@
+Users of QP/C Real-Time Embedded Framework (RTEF)
+qpc
+2023-12-31
+
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This generated code is free software: you can redistribute it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation.
+
+This code 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.
+
+NOTE:
+Alternatively, this generated code may be distributed 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.
+
+Contact information:
+
+
+#B825C9988DCDDACEDB8D6020A03FCE45174EA0AA
\ No newline at end of file
diff --git a/LICENSES/QP-Arduino_GPL_Exception.txt b/LICENSES/QP-Arduino_GPL_Exception.txt
new file mode 100644
index 00000000..18112ea3
--- /dev/null
+++ b/LICENSES/QP-Arduino_GPL_Exception.txt
@@ -0,0 +1,46 @@
+QP/C++ and QP-nano FRAMEWORK EXCEPTION FOR ARDUINO
+
+Version 3.0, December 22, 2021
+
+Copyright (c) 2005-2021 Quantum Leaps, LLC.
+
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+
+This QP/C++ and QP-nano Framework Exception for Arduino ("Exception")
+is an additional permission under section 7 of the GNU General Public
+License, version 3 ("GPLv3"). It applies to the QP/C++ and QP-nano
+source code (the "QP Frameworks") that is distributed as part of the
+QP-Arduino Support Package.
+
+When you use QP Frameworks inside your program, the QP Frameworks' code
+is combined with your code of the program. The purpose of this Exception
+is to allow non-GPL (including proprietary) programs to use, in this way,
+the QP Frameworks' code covered by this Exception.
+
+0. Definitions.
+"QP Frameworks" are lightweight real-time embedded frameworks (RTEFs)
+as well as all supporting ports and examples, as distributed from:
+ and
+
+
+"Arduino-Certified Board" means any board with an Arduino-supported
+CPU that bears an official Arduino logo and/or is officially certified
+under the Arduino Certified Program
+(see ).
+
+"Target Code" refers to output from any compiler and linker in
+executable form suitable for execution by an embedded microcontroller.
+
+
+1. Grant of Additional Permission
+As a special Exception, the copyright holder of QP Frameworks gives you
+permission to propagate a work of Target Code formed by combining
+the QP Frameworks with your own source code without the requirement
+to expose your proprietary source code, provided that all Target Code
+will execute on Arduino-Certified Board(s).
+
+2. No Weakening of GPL
+The availability of this Exception does not imply any general
+presumption that third-party software linking to the QP Framework is
+unaffected by the copyleft requirements of the GPLv3 license.
diff --git a/LICENSES/QP-RasPi_GPL_Exception.txt b/LICENSES/QP-RasPi_GPL_Exception.txt
new file mode 100644
index 00000000..2b54e5d4
--- /dev/null
+++ b/LICENSES/QP-RasPi_GPL_Exception.txt
@@ -0,0 +1,48 @@
+QP/C and QP/C++ FRAMEWORKS EXCEPTION FOR RASPBERRY PI
+
+Version 2.0, 2 August 2022
+
+Copyright (c) 2005-2021 Quantum Leaps, LLC.
+
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+
+This QP/C++ and QP-nano Framework Exception for Arduino ("Exception")
+is an additional permission under section 7 of the GNU General Public
+License, version 3 ("GPLv3"). It applies to the QP/C++ and QP-nano
+source code (the "QP Frameworks") that is distributed as part of the
+QP-Arduino Support Package.
+
+When you use QP Frameworks inside your program, the QP Frameworks' code
+is combined with your code of the program. The purpose of this Exception
+is to allow non-GPL (including proprietary) programs to use, in this way,
+the QP Frameworks' code covered by this Exception.
+
+0. Definitions.
+"QP Frameworks" are lightweight real-time embedded frameworks (RTEFs)
+as well as all supporting ports and examples, as distributed from:
+ and
+
+
+"Raspberry Pi" is a low cost, credit-card sized computer that is
+designed by the Raspberry Pi Foundation based in the UK and registered
+as UK educational charity under the number 1129409. For the purpose of
+this license, Raspberry Pi means only genuine Raspberry Pi computer
+bearing the Raspberry Pi logo, as described at
+.
+
+"Target Code" refers to output from any compiler and linker in
+executable form suitable for execution by Raspberry Pi.
+
+
+1. Grant of Additional Permission
+As a special Exception, the copyright holder of QP Frameworks gives you
+permission to propagate a work of Target Code formed by combining the QP
+Frameworks with your own source code without the requirement to expose
+your propriatory source code, provided that all Target Code will execute
+on a genuine Raspberry Pi computer(s).
+
+2. No Weakening of GPL
+The availability of this Exception does not imply any general
+presumption that third-party software linking to the QP Framework is
+unaffected by the copyleft requirements of the GPLv3 license.
diff --git a/LICENSES/QP-mbed_GPL_Exception.txt b/LICENSES/QP-mbed_GPL_Exception.txt
new file mode 100644
index 00000000..3ba91f32
--- /dev/null
+++ b/LICENSES/QP-mbed_GPL_Exception.txt
@@ -0,0 +1,42 @@
+QP/C and QP/C++ FRAMEWORKS EXCEPTION FOR ARM mbed
+
+Version 2.0, August 2022
+
+Copyright (c) 2005-2014 Quantum Leaps, LLC.
+
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+
+This QP/C++ and QP-nano Framework Exception for Arduino ("Exception")
+is an additional permission under section 7 of the GNU General Public
+License, version 3 ("GPLv3"). It applies to the QP/C++ and QP-nano
+source code (the "QP Frameworks") that is distributed as part of the
+QP-Arduino Support Package.
+
+When you use QP Frameworks inside your program, the QP Frameworks' code
+is combined with your code of the program. The purpose of this Exception
+is to allow non-GPL (including proprietary) programs to use, in this way,
+the QP Frameworks' code covered by this Exception.
+
+0. Definitions.
+"QP Frameworks" are lightweight real-time embedded frameworks (RTEFs)
+as well as all supporting ports and examples, as distributed from:
+ and
+
+
+"mbed-Enabled Board" means any board with an ARM Cortex-M CPU that is
+listed on the official "mbed platforms" website
+.
+
+
+1. Grant of Additional Permission
+As a special Exception, the copyright holder of QP Frameworks gives you
+permission to propagate a work of Target Code formed by combining
+the QP Frameworks with your own source code without the requirement
+to expose your proprietary source code, provided that all Target Code will
+execute on an "mbed-Enabled Board".
+
+2. No Weakening of GPL
+The availability of this Exception does not imply any general
+presumption that third-party software linking to the QP Framework is
+unaffected by the copyleft requirements of the GPLv3 license.
diff --git a/README.md b/README.md
index b5e36cd1..09b8d317 100644
--- a/README.md
+++ b/README.md
@@ -19,6 +19,9 @@ obtaining QP/C bundled together like that is that you get all components,
tools and examples ready to go.
### Getting Started Resources
+- ["QP/C Tutorial"][Tutorial]
+describes a series of progressively advanced QP/C example applications.
+
- [Video: "Getting Started with QP Real-Time Embedded Frameworks"][Video]
provides instructions on how to download, install, and get started with QP.
@@ -26,15 +29,6 @@ provides instructions on how to download, install, and get started with QP.
contains also a tutorial, in which you build a simple "Blinky" application.
-# Documentation
-The online HTML documention for the **latest** version of QP/C is located
-at: https://www.state-machine.com/qpc
-
-The offline HTML documentation for **this** particular version of QP/C
-is located in the sub-folder [html](html). To view the offline documentation,
-open the file [html/index.html](html/index.html) in your web browser.
-
-
# About QP/C
QP/C (Quantum Platform in C) is a lightweight, open source
[Real-Time Embedded Framework (RTEF)][RTEF] for building modern embedded
@@ -94,7 +88,7 @@ products ranging from implantable medical devices to complex weapon systems.
# QP/C Licensing
-QP/C is licensed under the increasingly popular [dual licensing model][Lic],
+QP/C is licensed under the sustainable [dual licensing model][Lic],
in which both the open source software distribution mechanism and
traditional closed source software distribution models are combined.
@@ -104,7 +98,12 @@ you don't use any open source license and you do not violate your policy.
# QP/C Documentation
-The **QP/C Manual** is located online at: https://www.state-machine.com/qpc
+The online HTML documention for the **latest** version of QP/C is located
+at: https://www.state-machine.com/qpc
+
+The offline HTML documentation for **this** particular version of QP/C
+is located in the sub-folder [html](html). To view the offline documentation,
+open the file [html/index.html](html/index.html) in your web browser.
# How to Get Help?
@@ -115,6 +114,13 @@ The **QP/C Manual** is located online at: https://www.state-machine.com/qpc
- [Quantum Leaps licensing](https://www.state-machine.com/licensing)
- [info@state-machine.com](mailto:info@state-machine.com)
+
+# How to Help this Project?
+If you like this project, please give it a star (in the upper-right corner of your browser window):
+
+![GitHub star](doxygen/images/github-star.jpg)
+
+
[RTEF]:
[QP]:
[QP/C]:
@@ -125,4 +131,5 @@ The **QP/C Manual** is located online at: https://www.state-machine.com/qpc
[Lic]:
[Cust]:
[AN]:
+ [Tutorial]:
[Video]:
diff --git a/doxygen/Doxyfile b/doxygen/Doxyfile
index ef92f08c..4ac536c2 100644
--- a/doxygen/Doxyfile
+++ b/doxygen/Doxyfile
@@ -1,17 +1,18 @@
-# Doxyfile 1.9.3
+# Doxyfile 1.9.4
-@INCLUDE = ../../ql-doxygen/Doxyfile-QL
+@INCLUDE = ../../ql-doxygen/ql-doxyfile
#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------
DOXYFILE_ENCODING = UTF-8
-PROJECT_NAME = QP/C
-PROJECT_NUMBER = 7.0.0
+PROJECT_NAME = "QP/C"
+PROJECT_NUMBER = 7.0.1
PROJECT_BRIEF = "Real-Time Embedded Framework"
-PROJECT_LOGO = images/logo_ql.png
+PROJECT_LOGO = ../../ql-doxygen/images/logo_ql.png
OUTPUT_DIRECTORY =
CREATE_SUBDIRS = NO
+CREATE_SUBDIRS_LEVEL = 6
ALLOW_UNICODE_NAMES = NO
OUTPUT_LANGUAGE = English
BRIEF_MEMBER_DESC = YES
@@ -41,7 +42,7 @@ PYTHON_DOCSTRING = YES
INHERIT_DOCS = YES
SEPARATE_MEMBER_PAGES = NO
TAB_SIZE = 4
-OPTIMIZE_OUTPUT_FOR_C = YES
+OPTIMIZE_OUTPUT_FOR_C = NO
OPTIMIZE_OUTPUT_JAVA = NO
OPTIMIZE_FOR_FORTRAN = NO
OPTIMIZE_OUTPUT_VHDL = NO
@@ -116,17 +117,13 @@ WARN_IF_INCOMPLETE_DOC = YES
WARN_NO_PARAMDOC = NO
WARN_AS_ERROR = NO
WARN_FORMAT = "$file:$line: $text"
+WARN_LINE_FORMAT = "at line $line of file $file"
WARN_LOGFILE =
#---------------------------------------------------------------------------
# Configuration options related to the input files
#---------------------------------------------------------------------------
INPUT = main.dox \
gs.dox \
- ../../cert-pack/srs.dox \
- ../../cert-pack/sas.dox \
- ../../cert-pack/sds.dox \
- ../../cert-pack/misra.dox \
- api.dox \
exa.dox \
exa_native.dox \
exa_rtos.dox \
@@ -138,25 +135,19 @@ INPUT = main.dox \
ports_arm-cm.dox \
ports_rtos.dox \
ports_os.dox \
- metrics.dox \
+ api.dox \
history.dox \
- modules.dox \
+ ../../ql-doxygen/help.dox \
+ ../../cert-pack/srs.dox \
+ ../../cert-pack/sas.dox \
+ ../../cert-pack/sds.dox \
+ ../../cert-pack/misra.dox \
+ ../../cert-pack/tr.dox \
+ metrics.dox \
dir.dox \
- macros.h \
- ../include/qpc.h \
- ../include/qep.h \
- ../include/qf.h \
- ../include/qequeue.h \
- ../include/qmpool.h \
- ../include/qpset.h \
- ../include/qv.h \
- ../include/qk.h \
- ../include/qxk.h \
- ../include/qxthread.h \
- ../include/qs.h \
+ config.h \
../include \
- ../src \
- ../../ql-doxygen/help.dox
+ ../src
INPUT_ENCODING = UTF-8
FILE_PATTERNS = *.dox \
@@ -169,7 +160,8 @@ FILE_PATTERNS = *.dox \
*.lnt
RECURSIVE = YES
-EXCLUDE = ../include/qs_dummy.h
+EXCLUDE = ../include/qs_dummy.h \
+ ../include/quit.h
EXCLUDE_SYMLINKS = NO
EXCLUDE_PATTERNS =
@@ -218,18 +210,24 @@ IGNORE_PREFIX =
GENERATE_HTML = YES
HTML_OUTPUT = ../html
HTML_FILE_EXTENSION = .html
-HTML_HEADER = ../../ql-doxygen/header-awesome.html
-HTML_FOOTER = ../../ql-doxygen/footer-awesome.html
+HTML_HEADER = ../../ql-doxygen/ql-header-awesome.html
+HTML_FOOTER = ../../ql-doxygen/ql-footer-awesome.html
HTML_STYLESHEET =
HTML_EXTRA_STYLESHEET = ../../ql-doxygen/doxygen-awesome.css \
+ ../../ql-doxygen/doxygen-awesome-sidebar-only.css \
+ ../../ql-doxygen/doxygen-awesome-sidebar-only-darkmode-toggle.css \
../../ql-doxygen/ql-awesome.css
+
HTML_EXTRA_FILES = ../../ql-doxygen/doxygen-awesome-darkmode-toggle.js \
- ../../ql-doxygen/preview.js
+ ../../ql-doxygen/doxygen-awesome-fragment-copy-button.js \
+ ../../ql-doxygen/doxygen-awesome-paragraph-link.js \
+ ../../ql-doxygen/ql-preview.js
+
HTML_COLORSTYLE_HUE = 209
HTML_COLORSTYLE_SAT = 255
HTML_COLORSTYLE_GAMMA = 113
HTML_TIMESTAMP = NO
-HTML_DYNAMIC_MENUS = NO
+HTML_DYNAMIC_MENUS = YES
HTML_DYNAMIC_SECTIONS = NO
HTML_INDEX_NUM_ENTRIES = 100
GENERATE_DOCSET = NO
@@ -255,11 +253,11 @@ QHP_SECT_FILTER_ATTRS =
QHG_LOCATION =
GENERATE_ECLIPSEHELP = NO
ECLIPSE_DOC_ID = com.state-machine.qp
-DISABLE_INDEX = YES
+DISABLE_INDEX = NO
GENERATE_TREEVIEW = YES
FULL_SIDEBAR = NO
ENUM_VALUES_PER_LINE = 4
-TREEVIEW_WIDTH = 300
+TREEVIEW_WIDTH = 335
EXT_LINKS_IN_WINDOW = NO
OBFUSCATE_EMAILS = NO
HTML_FORMULA_FORMAT = png
@@ -293,15 +291,15 @@ PREDEFINED = Q_SPY \
Q_UTEST \
QK_ON_CONTEXT_SW \
QXK_ON_CONTEXT_SW \
- QF_MAX_ACTIVE \
- QF_MAX_TICK_RATE \
- QF_MAX_EPOOL \
- QF_EVENT_SIZ_SIZE \
- QF_EQUEUE_CTR_SIZE \
- QF_MPOOL_SIZ_SIZE \
- QF_MPOOL_CTR_SIZE \
- QF_TIMEEVT_CTR_SIZE \
- QF_ACTIVE_STOP \
- QS_TIME_SIZE
+ QF_MAX_ACTIVE=32 \
+ QF_MAX_TICK_RATE=2 \
+ QF_MAX_EPOOL=3 \
+ QF_EVENT_SIZ_SIZE=2 \
+ QF_EQUEUE_CTR_SIZE=2 \
+ QF_MPOOL_SIZ_SIZE=2 \
+ QF_MPOOL_CTR_SIZE=2 \
+ QF_TIMEEVT_CTR_SIZE=4 \
+ QF_ACTIVE_STOP=0 \
+ QS_TIME_SIZE=4
EXPAND_AS_DEFINED =
SKIP_FUNCTION_MACROS = YES
diff --git a/doxygen/Doxyfile-CERT b/doxygen/Doxyfile-CERT
index cecbd538..7cc0d69b 100644
--- a/doxygen/Doxyfile-CERT
+++ b/doxygen/Doxyfile-CERT
@@ -6,5 +6,6 @@
# Configuration options related to the input files
#---------------------------------------------------------------------------
-ENABLED_SECTIONS += CERT
+ENABLED_SECTIONS += CERT
+HTML_OUTPUT = ../cert-pack
diff --git a/doxygen/Doxyfile-CHM b/doxygen/Doxyfile-CHM
index 703285c0..3755a354 100644
--- a/doxygen/Doxyfile-CHM
+++ b/doxygen/Doxyfile-CHM
@@ -1,4 +1,4 @@
-# Doxyfile 1.9.3
+# Doxyfile 1.9.4
@INCLUDE = Doxyfile
@@ -8,8 +8,8 @@
PROJECT_LOGO = images/logo_ql-comp.png
HTML_OUTPUT = tmp
-HTML_HEADER = ../../ql-doxygen/header.html
-HTML_FOOTER = ../../ql-doxygen/footer.html
+HTML_HEADER = ../../ql-doxygen/ql-header.html
+HTML_FOOTER = ../../ql-doxygen/ql-footer.html
HTML_EXTRA_STYLESHEET = ../../ql-doxygen/ql.css
-HTML_EXTRA_FILES = ../../ql-doxygen/preview.js
+HTML_EXTRA_FILES = ../../ql-doxygen/ql-preview.js
GENERATE_HTMLHELP = YES
diff --git a/doxygen/DoxygenLayout.xml b/doxygen/DoxygenLayout.xml
new file mode 100644
index 00000000..1cb2df23
--- /dev/null
+++ b/doxygen/DoxygenLayout.xml
@@ -0,0 +1,240 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doxygen/api.dox b/doxygen/api.dox
index 9944267e..1cd4f5e6 100644
--- a/doxygen/api.dox
+++ b/doxygen/api.dox
@@ -1,6 +1,5 @@
/*! @page api API Reference
-
-@tableofcontents
+@nav_next{deprecated}
@section api_qep QEP (Hierarchical State Machines)
QEP is a universal, UML-compliant event processor that enables developers to code UML state machines in highly readable ANSI-C, in which every state machine element is mapped to code precisely, unambiguously, and exactly once (traceability). QEP fully supports hierarchical state nesting, which is the fundamental mechanism for reusing behavior across many states instead of repeating the same actions and transitions over and over again.
@@ -18,7 +17,7 @@ QEP is a universal, UML-compliant event processor that enables developers to cod
- QMsm_ctor()
- QMsm_isInState()
- QMsm_stateObj()
-
+- Q_STATE_CAST()
@section api_qf QF (Active Object Framework)
@@ -49,7 +48,7 @@ QF is a portable, event-driven, real-time framework for execution of active obje
- QActive_unsubscribeAll()
-@subsection api_qf_evt Dynamic Events
+@subsection api_qf_evt Event Management
- ::QEvt class
- QF_poolInit()
- Q_NEW()
@@ -57,6 +56,7 @@ QF is a portable, event-driven, real-time framework for execution of active obje
- Q_NEW_REF()
- Q_DELETE_REF()
- QF_gc()
+- Q_EVT_CAST()
@subsection api_qf_time Time Events
@@ -89,8 +89,7 @@ QF is a portable, event-driven, real-time framework for execution of active obje
- QMPool_put()
-
-@section api_qs QS ("Quantum Spy" Software Tracing)
+@section api_qs QS (Software Tracing)
QS is a software tracing system that enables developers to monitor live event-driven QP applications with minimal target system resources and without stopping or significantly slowing down the code. QS is an ideal tool for testing, troubleshooting, and optimizing QP applications. QS can even be used to support acceptance testing in product manufacturing.
@@ -121,6 +120,7 @@ QS is a software tracing system that enables developers to monitor live event-dr
@subsection api_qs_dict QS Dictionaries
- QS_SIG_DICTIONARY()
- QS_OBJ_DICTIONARY()
+- QS_OBJ_ARR_DICTIONARY()
- QS_FUN_DICTIONARY()
- QS_USR_DICTIONARY()
@@ -156,8 +156,8 @@ Given the simplicity, portability, and low-resource consumption, the QV schedule
- QV_CPU_SLEEP()
-@section api_qk QK (Preemptive Run-to-Completion Kernel)
-QK is a tiny **preemptive**, priority-based, non-blocking kernel designed specifically for executing active objects. QK runs active objects in the same way as prioritized interrupt controller (such as NVIC in ARM Cortex-M) runs interrupts using the single stack. Active objects process their events in run-to-completion (RTC) fashion and remove themselves from the call stack, the same way as nested interrupts remove themselves from the stack upon completion. At the same time high-priority active objects can preempt lower-priority active objects, just like interrupts can preempt each other under a prioritized interrupt controller. QK meets all the requirement of the Rate Monotonic Scheduling (a.k.a. Rate Monotonic Analysis RMA) and can be used in hard real-time systems.
+@section api_qk QK (Preemptive RTC Kernel)
+QK is a tiny **preemptive**, run-to-completion (RTC) kernel designed specifically for executing active objects. QK runs active objects in the same way as prioritized interrupt controller (such as NVIC in ARM Cortex-M) runs interrupts using the single stack. Active objects process their events in run-to-completion (RTC) fashion and remove themselves from the call stack, the same way as nested interrupts remove themselves from the stack upon completion. At the same time high-priority active objects can preempt lower-priority active objects, just like interrupts can preempt each other under a prioritized interrupt controller. QK meets all the requirement of the Rate Monotonic Scheduling (a.k.a. Rate Monotonic Analysis RMA) and can be used in hard real-time systems.
@subsection api_qk_ctrl Kernel Initialization and Control
@@ -173,9 +173,8 @@ QK is a tiny **preemptive**, priority-based, non-blocking kernel designed specif
- QK_ISR_EXIT()
-@section api_qxk QXK (Preemptive Dual-Mode RTOS Kernel)
-QXK is a small, preemptive, priority-based, dual-mode **blocking** kernel that executes active objects like the @ref qk "QK kernel", but can also execute traditional __blocking__ threads (extended threads). In this respect, QXK behaves exactly as a conventional __RTOS__ (Real-Time Operating System). QXK has been designed specifically for mixing event-driven active objects with traditional blocking code, such as commercial middleware (TCP/IP stacks, UDP stacks, embedded file systems, etc.) or legacy software.
-
+@section api_qxk QXK (Dual-Mode Kernel)
+QXK is a small, preemptive, priority-based, dual-mode (run-to-completion/**blocking**) kernel that executes active objects like the @ref srs_qk "QK kernel", but can also execute traditional __blocking__ threads (extended threads). In this respect, QXK behaves exactly as a conventional __RTOS__ (Real-Time Operating System). QXK has been designed specifically for mixing event-driven active objects with traditional blocking code, such as commercial middleware (TCP/IP stacks, UDP stacks, embedded file systems, etc.) or legacy software.
@subsection api_qxk_ctrl Kernel Initialization and Control
@@ -200,7 +199,8 @@ QXK is a small, preemptive, priority-based, dual-mode **blocking** kernel that e
- QXThread_delay()
- QXThread_delayCancel()
- QXThread_queueGet()
-
+- QXK_current()
+- QXK_TLS()
@subsection api_qxk_sema Semaphores
- ::QXSemaphore class (Semaphore Control Block)
@@ -224,23 +224,18 @@ QXK is a small, preemptive, priority-based, dual-mode **blocking** kernel that e
- QXThread_queueGet() - waiting (blocking) on message queue
-
@subsection api_qxk_mem Memory Pools
- ::QMPool class
- QMPool_init()
- QMPool_get()
- QMPool_put()
-
-@subsection api_qxk_tls Thread-Local Storage
-- QXK_current()
-- QXK_TLS()
-
-@next{deprecated}
+
+@nav_next{deprecated}
*/
-/*##########################################################################*/
+##############################################################################
/*! @page deprecated Deprecated APIs
-__The following QP/C APIs are now deprecated:__
+**The following QP/C APIs are now deprecated:**
*/
diff --git a/doxygen/config.h b/doxygen/config.h
new file mode 100644
index 00000000..5df361c2
--- /dev/null
+++ b/doxygen/config.h
@@ -0,0 +1,411 @@
+/**
+* @file
+* @brief Various macros for configuring and porting QP/C
+*/
+
+/*! The maximum number of active objects in the application.
+*
+* @description
+* This macro *must* be defined in the QF port and should be in range
+* of 1U..64U, inclusive. The value of this macro determines the maximum
+* priority level of an active object in the system. Not all priority
+* levels must be used, but the maximum priority cannot exceed
+* #QF_MAX_ACTIVE.
+*
+* @note Once you choose a certain value of #QF_MAX_ACTIVE, you must
+* consistently use the same value in building all the QP component libraries
+* and your own application code. The consistency is guaranteed if you define
+* this macro only once in the qf_port.h header file and henceforth include
+* this header file in all builds.
+*/
+#define QF_MAX_ACTIVE 32U
+
+/*! The maximum number of clock tick rates in the application.
+*
+* @description
+* This macro can be defined in the QF ports and should be in range
+* of 1U..15U, inclusive. The value of this macro determines the maximum
+* number of clock tick rates for time events (::QTimeEvt).
+*
+* If the macro is not defined, the default value is 1U.
+*
+* @note Once you choose a certain value of #QF_MAX_TICK_RATE, you must
+* consistently use the same value in building all the QP component libraries
+* and your own application code. The consistency is guaranteed if you define
+* this macro only once in the qf_port.h header file and henceforth include
+* this header file in all builds.
+*/
+#define QF_MAX_TICK_RATE 1U
+
+/*! The maximum number of event pools in the application.
+*
+* @description
+* This macro can be defined in the QF ports and should be in range
+* of 1U..255U, inclusive. The value of this macro determines the maximum
+* event pools in the system. Not all event pools must be actually used,
+* but the maximum number of pools cannot exceed #QF_MAX_EPOOL.
+*
+* If the macro is not defined, the default value is 3U. Defining the value
+* below the maximum saves some memory, mostly for the subscriber-lists.
+* @sa ::QSubscrList.
+*
+* @note Once you choose a certain value of #QF_MAX_EPOOL, you must
+* consistently use the same value in building all the QP component libraries
+* and your own application code. The consistency is guaranteed if you define
+* this macro only once in the qf_port.h header file and henceforth include
+* this header file in all builds.
+*/
+#define QF_MAX_EPOOL 3U
+
+/*! The size (in bytes) of the event-size representation in the QF.
+* Valid values: 1U, 2U, or 4U; default 2U
+*
+* @description
+* This macro can be defined in the QF ports to configure the size
+* of the event-size.
+*
+* @note Once you choose a certain value of #QF_EVENT_SIZ_SIZE, you must
+* consistently use the same value in building all the QP component libraries
+* and your own application code. The consistency is guaranteed if you define
+* this macro only once in the qf_port.h header file and henceforth include
+* this header file in all builds.
+*/
+#define QF_EVENT_SIZ_SIZE 2U
+
+/*! The size (in bytes) of the ring-buffer counters used in the native QF
+* event queue implementation. Valid values: 1U, 2U, or 4U; default 1U
+*
+* @description
+* This macro can be defined in the QF ports to configure the ::QEQueueCtr
+* type. If the macro is not defined, the default of 1 byte will be chosen in
+* qequeue.h. The valid #QF_EQUEUE_CTR_SIZE values of 1U, 2U, or 4U, correspond
+* to ::QEQueueCtr of uint8_t, uint16_t, and uint32_t, respectively. The
+* ::QEQueueCtr data type determines the dynamic range of numerical values of
+* ring-buffer counters inside event queues, or, in other words, the maximum
+* number of events that the native QF event queue can manage.
+* @sa ::QEQueue
+*
+* @note Once you choose a certain value of #QF_EQUEUE_CTR_SIZE, you must
+* consistently use the same value in building all the QP component libraries
+* and your own application code. The consistency is guaranteed if you define
+* this macro only once in the qf_port.h header file and henceforth include
+* this header file in all builds.
+*/
+#define QF_EQUEUE_CTR_SIZE 1U
+
+/*! The size (in bytes) of the block-size representation in the native QF
+* event pool. Valid values: 1U, 2U, or 4U; default #QF_EVENT_SIZ_SIZE.
+*
+* @description
+* This macro can be defined in the QF ports to configure the ::QMPoolSize
+* type. If the macro is not defined, the default of #QF_EVENT_SIZ_SIZE
+* will be chosen in qmpool.h, because the memory pool is primarily used for
+* implementing event pools.
+*
+* The valid #QF_MPOOL_SIZ_SIZE values of 1U, 2U, or 4U, correspond to
+* ::QMPoolSize of uint8_t, uint16_t, and uint32_t, respectively. The
+* ::QMPoolSize data type determines the dynamic range of block-sizes that
+* the native ::QMPool can handle.
+* @sa #QF_EVENT_SIZ_SIZE, ::QMPool
+*
+* @note Once you choose a certain value of #QF_MPOOL_SIZ_SIZE, you must
+* consistently use the same value in building all the QP component libraries
+* and your own application code. The consistency is guaranteed if you define
+* this macro only once in the qf_port.h header file and henceforth include
+* this header file in all builds.
+*/
+#define QF_MPOOL_SIZ_SIZE 2U
+
+/*! The size (in bytes) of the block-counter representation in the
+* native QF event pool. Valid values: 1U, 2U, or 4U; default 2U.
+*
+* @description
+* This macro can be defined in the QF ports to configure the ::QMPoolCtr
+* type. If the macro is not defined, the default of 2 bytes will be chosen
+* in qmpool.h. The valid #QF_MPOOL_CTR_SIZE values of 1U, 2U, or 4U,
+* correspond to ::QMPoolSize of uint8_t, uint16_t, and uint32_t, respectively.
+* The ::QMPoolCtr data type determines the dynamic range of block-counters
+* that the native ::QMPool can handle, or, in other words, the maximum number
+* of blocks that the native QF event pool can manage.
+* @sa ::QMPool
+*
+* @note Once you choose a certain value of #QF_MPOOL_CTR_SIZE, you must
+* consistently use the same value in building all the QP component libraries
+* and your own application code. The consistency is guaranteed if you define
+* this macro only once in the qf_port.h header file and henceforth include
+* this header file in all builds.
+*/
+#define QF_MPOOL_CTR_SIZE 2U
+
+/*! The size (in bytes) of the time event-counter representation
+* in the ::QTimeEvt struct. Valid values: 1U, 2U, or 4U; default 2U.
+*
+* @description
+* This macro can be defined in the QF ports to configure the internal tick
+* counters of Time Events. If the macro is not defined, the default of 2
+* bytes will be chosen in qf.h. The valid #QF_TIMEEVT_CTR_SIZE values of 1,
+* 2, or 4, correspond to tick counters of uint8_t, uint16_t, and uint32_t,
+* respectively. The tick counter representation determines the dynamic range
+* of time delays that a Time Event can handle.
+* @sa ::QTimeEvt
+*
+* @note Once you choose a certain value of #QF_TIMEEVT_CTR_SIZE, you must
+* consistently use the same value in building all the QP component libraries
+* and your own application code. The consistency is guaranteed if you define
+* this macro only once in the qf_port.h header file and henceforth include
+* this header file in all builds.
+*/
+#define QF_TIMEEVT_CTR_SIZE 2U
+
+/*! Define the interrupt disabling policy.
+*
+* @description
+* This macro encapsulates platform-specific way of disabling interrupts
+* from "C" for a given CPU and compiler.
+*
+* @note
+* the #QF_INT_DISABLE macro should always be used in pair with the
+* macro #QF_INT_ENABLE.
+*/
+#define QF_INT_DISABLE() intDisable()
+
+/*! Define the interrupt enabling policy.
+*
+* @description
+* This macro encapsulates platform-specific way of enabling interrupts
+* from "C" for a given CPU and compiler.
+*
+* @note the #QF_INT_DISABLE macro should always be used in pair with the
+* macro #QF_INT_ENABLE.
+*/
+#define QF_INT_ENABLE() intEnable()
+
+void intDisable(void);
+void intEnable(void);
+
+/*! Define the type of the critical section status.
+*
+* @description
+* Defining this macro configures the "saving and restoring critical section
+* status" policy. Coversely, if this macro is not defined, the simple
+* "unconditional critical section exit" is used.
+*/
+#define QF_CRIT_STAT_TYPE crit_stat_t
+
+/*! Define the critical section entry policy.
+*
+* @description
+* This macro enters a critical section (often by means of disabling
+* interrupts). When the "saving and restoring critical section status"
+* policy is used, the macro sets the @a status_ argument to the critical
+* section status just before the entry. When the policy of "unconditional
+* critical section exit" is used, the macro does not use the @a status_
+* argument.
+*
+* @note the #QF_CRIT_ENTRY macro should always be used in pair with the
+* macro #QF_CRIT_EXIT.
+*/
+#define QF_CRIT_ENTRY(stat_) ((stat_) = critEntry())
+
+/*! Define the critical section exit policy.
+/*
+* @description
+* This macro enters a critical section (often by means of disabling
+* interrupts). When the "saving and restoring critical section status"
+* policy is used, the macro restores the critical section status from the
+* @a status_ argument. When the policy of "unconditional critical section
+* exit" is used, the macro does not use the @a status argument and
+* exits the critical section unconditionally (often by means of enabling
+* interrupts).
+*
+* @note the #QF_CRIT_ENTRY macro should always be used in pair with the
+* macro #QF_CRIT_EXIT.
+*/
+#define QF_CRIT_EXIT(stat_) critExit(stat_)
+
+typedef unsigned int crit_stat_t;
+crit_stat_t critEntry(void);
+void critExit(crit_stat_t stat);
+
+/*! Enable the QActive_stop() API in the QF port.
+*
+* @description
+* Defining this macro enables the QActive_stop() API in a given port.
+* This feature should be used with caution, as stopping and re-starting
+* active objects **cleanly** can be tricky.
+*/
+#define QF_ACTIVE_STOP
+
+/*! The preprocessor switch to disable checking assertions
+*
+* @description
+* When defined, Q_NASSERT disables the following macros #Q_ASSERT,
+* #Q_REQUIRE, #Q_ENSURE, #Q_INVARIANT, #Q_ERROR as well as
+* #Q_ASSERT_ID, #Q_REQUIRE_ID, #Q_ENSURE_ID, #Q_INVARIANT_ID, and
+* #Q_ERROR_ID do _not_ evaluate the test condition passed as the
+* argument to these macros.
+*
+* @note The notable exceptions are the macros #Q_ALLEGE and
+* #Q_ALLEGE_ID, that still evaluate the test condition, but do not
+* report assertion failures when the switch #Q_NASSERT is defined.
+*/
+#define Q_NASSERT
+
+/*! The preprocessor switch to activate the QS software tracing
+* instrumentation in the code
+*
+* @description
+* When defined, Q_SPY activates the QS software tracing instrumentation.
+* When Q_SPY is not defined, the QS instrumentation in the code does
+* not generate any code.
+*/
+#define Q_SPY
+
+/*! The preprocessor switch to activate the QUTest unit testing
+* instrumentation in the code
+*
+* @note
+* This macro requires that #Q_SPY be defined as well.
+*/
+#define Q_UTEST
+
+/*! The preprocessor switch to enable constructor in the ::QEvt class
+* instrumentation in the code
+*
+* @tr{RQP005}
+*/
+#define Q_EVT_CTOR
+
+/*! This macro defines the type of the thread handle used for AOs */
+#define QF_THREAD_TYPE void*
+
+/*! This macro defines the type of the event-queue used for AOs */
+#define QF_EQUEUE_TYPE QEQueue
+
+/*! This macro defines the type of the OS-Object used for blocking
+* the native ::QEQueue when the queue is empty
+*
+* @description
+* This macro is used when ::QEQueue is used as the event-queue for AOs
+* but also the AO queue must *block* when the queue is empty.
+* In that case, #QF_OS_OBJECT_TYPE specifies the blocking mechanism.
+* For example, in the POSIX port, the blocking mechanism is a condition
+* variable.
+*/
+#define QF_OS_OBJECT_TYPE pthread_cond_t
+
+/*! Platform-dependent macro defining how QF should block the
+* calling task when the QF native queue is empty
+*
+* @note
+* This is just an example of QACTIVE_EQUEUE_WAIT_() for the QK-port
+* of QF. QK never activates a task that has no events to process, so in
+* this case the macro asserts that the queue is not empty. In other QF
+* ports you need to define the macro appropriately for the underlying
+* kernel/OS you're using.
+*/
+#define QACTIVE_EQUEUE_WAIT_(me_) \
+ (Q_ASSERT((me_)->eQueue.frontEvt != (QEvt *)0))
+
+#if (QF_MAX_ACTIVE <= 8U)
+ #define QACTIVE_EQUEUE_SIGNAL_(me_) do { \
+ QPSet8_insert(&QF_readySet_, (me_)->prio); \
+ if (QF_intNest_ == 0U) { \
+ uint_fast8_t p = QK_schedPrio_(); \
+ if (p != 0U) { \
+ QK_sched_(p); \
+ } \
+ } \
+ } while (0)
+#else
+ /*! Platform-dependent macro defining how QF should signal the
+ * active object task that an event has just arrived.
+ *
+ * @description
+ * The macro is necessary only when the native QF event queue is used.
+ * The signaling of task involves unblocking the task if it is blocked.
+ *
+ * @note QACTIVE_EQUEUE_SIGNAL_() is called from a critical section.
+ * It might leave the critical section internally, but must restore
+ * the critical section before exiting to the caller.
+ *
+ * @note This is just an example of QACTIVE_EQUEUE_SIGNAL_() for the
+ * QK-port of QF. In other QF ports you need to define the macro
+ * appropriately for the underlying kernel/OS you're using.
+ */
+ #define QACTIVE_EQUEUE_SIGNAL_(me_) do { \
+ QPSet64_insert(&QF_readySet_, (me_)->prio); \
+ if (QF_intNest_ == 0U) { \
+ uint_fast8_t p = QK_schedPrio_(); \
+ if (p != 0U) { \
+ QK_sched_(p); \
+ } \
+ } \
+ } while (0)
+#endif
+
+/*! This macro defines the type of the event pool used in the QK kernel.
+*
+* @note This is a specific implementation for the QK-port of QF.
+* In other QF ports you need to define the macro appropriately for
+* the underlying kernel/OS you're using.
+*/
+#define QF_EPOOL_TYPE_ QMPool
+
+/*! This macro enables calling the QK context-switch callback
+* QK_onContextSw()
+*/
+#define QK_ON_CONTEXT_SW
+
+/*! This macro enables calling the QXK context-switch callback
+* QXK_onContextSw()
+*/
+#define QXK_ON_CONTEXT_SW
+
+/*! Platform-dependent macro defining the event pool initialization
+*
+* @note
+* This is an example implementation based on the native ::QMPool class.
+* In other QF ports, the port might be using a memory pool from the
+* underlying kernel/OS.
+*/
+#define QF_EPOOL_INIT_(p_, poolSto_, poolSize_, evtSize_) \
+ (QMPool_init(&(p_), (poolSto_), (poolSize_), (QMPoolSize)(evtSize_)))
+
+/*! Platform-dependent macro defining how QF should obtain the
+* event pool block-size
+*
+* @note
+* This is a specific implementation for the built-in kernels.
+* In other QF ports you need to define the macro appropriately for
+* the underlying kernel/OS you're using.
+*/
+#define QF_EPOOL_EVENT_SIZE_(p_) ((uint32_t)(p_).blockSize)
+
+/*! Platform-dependent macro defining how QF should obtain an event
+* @a e_ from the event pool @a p_ with the free margin @a m_.
+*
+* @note
+* This is an example implementation based on the native ::QMPool class.
+* In other QF ports, the port might be using a memory pool from the
+* underlying kernel/OS.
+*/
+#define QF_EPOOL_GET_(p_, e_, m_, qs_id_) \
+ ((e_) = (QEvt *)QMPool_get(&(p_), (m_), (qs_id_)))
+
+/*! Platform-dependent macro defining how QF should return an event
+* @a e_ to the event pool @a p_
+*
+* @note
+* This is an example implementation based on the native ::QMPool class.
+* In other QF ports, the port might be using a memory pool from the
+* underlying kernel/OS.
+*/
+#define QF_EPOOL_PUT_(p_, e_, qs_id_) \
+ (QMPool_put(&(p_), (e_), (qs_id_)))
+
+/*! Macro defined only for the internal QP implementation. It should
+* be not defined for the application-level code
+*/
+#define QP_IMPL
+
diff --git a/doxygen/dir.dox b/doxygen/dir.dox
index 41f73dd6..965eda7a 100644
--- a/doxygen/dir.dox
+++ b/doxygen/dir.dox
@@ -1,15 +1,13 @@
/*##########################################################################*/
-/*! @dir ../include
-
-Platform-independent QP™/C API
+/*! @dir include
+@brief Platform-independent QP™/C API
@attention
The QP™/C include directory needs to be added to the compiler's include path in the applications using QP™/C.
*/
/*##########################################################################*/
-/*! @dir ../src
-
-Platform-independent QP™/C source code
+/*! @dir src
+@brief Platform-independent QP™/C source code
Files from this directory need to be added to the project, to build the QP™/C framework from source code.
@@ -17,44 +15,34 @@ Files from this directory need to be added to the project, to build the QP&trade
The QP™/C src directory needs to be added to the compiler's include path in the applications that build QP™/C framework from sources (as opposed to using QP as a pre-built library).
*/
/*##########################################################################*/
-/*! @dir ../src/qf
-
-Platform-independent implementation of the @ref qep and @ref qf components.
+/*! @dir src/qf
+@brief Platform-independent implementation of the @ref qep and @ref qf components.
@note
Typically, files in this directory need to be added to the application build, but some QP ports might not need all the files in this directory. For example, a QP port to a 3rd-party RTOS kernel might be using a message queue of the RTOS instead of the native QP event queue, in which case the file qf_actq.c would not be needed and should be excluded from the build.
*/
/*##########################################################################*/
-/*! @dir ../src/qv
-
-Platform-independent implementation of the @ref qv built-in kernel.
+/*! @dir src/qv
+@brief Platform-independent implementation of the @ref srs_qv built-in kernel.
@attention
-Files in this directory need to be included in the QP application build only if the application uses the @ref qv kernel.
+Files in this directory need to be included in the QP application build only if the application uses the @ref srs_qv kernel.
*/
/*##########################################################################*/
-/*! @dir ../src/qk
-
-Platform-independent implementation of the @ref qk built-in kernel.
+/*! @dir src/qk
+@brief Platform-independent implementation of the @ref srs_qk built-in kernel.
@attention
-Files in this directory need to be included in the QP application build only if the application uses the @ref qk kernel.
+Files in this directory need to be included in the QP application build only if the application uses the @ref srs_qk kernel.
*/
/*##########################################################################*/
-/*! @dir ../src/qxk
-
-Platform-independent implementation of the @ref qxk built-in kernel.
+/*! @dir src/qxk
+@brief Platform-independent implementation of the @ref srs_qxk built-in kernel.
@attention
-Files in this directory need to be included in the QP application build only if the application uses the @ref qxk kernel.
+Files in this directory need to be included in the QP application build only if the application uses the @ref srs_qxk kernel.
*/
/*##########################################################################*/
-/*! @dir ../src/qs
-
-Platform-independent implementation of the @ref qs component (software tracing).
-*/
-/*##########################################################################*/
-/*! @dir ../3rd_party
-
-3rd-Party code used in the QP™/C @ref ports "ports" and @ref exa "examples"
+/*! @dir src/qs
+@brief Platform-independent implementation of the @ref qs component (software tracing).
*/
diff --git a/doxygen/exa.dox b/doxygen/exa.dox
index b6bc79f8..002d99fa 100644
--- a/doxygen/exa.dox
+++ b/doxygen/exa.dox
@@ -1,7 +1,5 @@
/*! @page exa Examples
-@tableofcontents
-
@section exa_gen General Comments
The QP/C distribution contains many @subpage exa_ref "example projects" to demonstrate various QP/C features. Each example project is described on its own dedicated page that you can find using several criteria (see @ref exa_ref). The example projects have the following main goals:
@@ -15,7 +13,6 @@ The QP/C distribution contains many @subpage exa_ref "example projects" to demon
It is highly recommended that you create your own projects by **copying and modifying** existing example projects rather than starting your QP/C projects from scratch.
-
@subsection exa_code Example Code Structure
QP/C examples are located in sub-directories of the examples top-level folder, with the hierarchical organization outlined below:
@@ -193,7 +190,7 @@ QP/C examples are located in sub-directories of the exa
A @subpage exa_native "Native examples" are located in sub-directories named after the CPU architecture, such as arm-cm for ARM Cortex-M. Under that directory, the sub-directories blinky_ek-tm4c123gxl contain the specific example on the specified board, such as "Blinky" on the EK-TM4C123GXL board here. In the specific example folder, you find sub-folders for the @ref comp_qv "QV", @ref comp_qk "QK" and @ref comp_qxk "QXK" kernels, respectively.
- B @subpage exa_rtos "Examples for 3rd-party RTOS"/@ref exa_os "OS" are located in sub-directories named after the RTOS/OS, such as ucos-ii for uCOS-II RTOS. Under that directory, the sub-directories, such as arm-cm, contain examples for the specified CPU architecture, such as ARM Cortex-M here.
+ B @subpage exa_rtos "Examples for 3rd-party RTOS"/@ref exa_os "OS" are located in sub-directories named after the RTOS/OS, such as uc-os2 for uc-os2 RTOS. Under that directory, the sub-directories, such as arm-cm, contain examples for the specified CPU architecture, such as ARM Cortex-M here.
C @subpage exa_mware "Examples for 3rd-party Middleware" are located in sub-directories named after the middleware, such as lwIP for the lwIP TCP/IP stack. Under that directory, the sub-directories, such as arm-cm, contain examples for the specified CPU architecture, such as ARM Cortex-M here.
@@ -210,7 +207,6 @@ QP/C examples are located in sub-directories of the exa
Because the QP distribution contains *all* examples, the number of sub-directories and files in the examples folder may seem daunting. However, knowing the structure of the examples folder, you can simply ignore or even delete the sub-directories that are not interesting to you.
-
@subsection exa_sec_apps Example Applications
To demonstrate QP/C features on an embedded board, you need to create an application that does "something interesting". Instead of inventing this "something interesting" for each and every example, the example projects implement one of the three "example applications", which are described on the @ref gs_tut "QP™/C Tutorial":
@@ -228,12 +224,10 @@ Beyond these basic applications for demonstrating and testing the various @ref p
While some provided examples can run on your @ref exa_os "desktop computer", most embedded example projects require special hardware in form of @ref exa_sec_boards, which you need to acquire to be able to run the examples. The boards chosen for the examples are generally inexpensive and self-contained with no need for external hardware (such as external JTAG debuggers or power supplies).
-
@subsection exa_sec_tools Development Tools
Most provided examples require special embedded cross-development tools, such as embedded compilers, linkers, debuggers and IDEs, which you need to acquire independently from the QP/C distribution. Generally, the examples work with the free (size limited) evaluation versions of the commercial tools. The examples list the versions of tools they were developed and tested with. Please refer to the @ref exa_ref "cross-reference section" @ref exa_sec_tools to see which embedded toolchains are used.
-
@subsection exa_sec_conf Build Configurations
QP examples @ref ports "QP ports" are provided in the following three **build configurations**:
@@ -249,7 +243,6 @@ QP examples @ref ports "QP ports" are provided in the following three **build co
The different phases of embedded software life cycle pose different challenges. During the development and maintenance phase, for example, the emphasis is on the ease of debugging and verifying the correctness of the code, which require lower levels of optimization and special scaffolding code. In contrast, for releasing the code in the final product, the emphasis is on small memory footprint and CPU time efficiency, which require high-level of optimization and removal of any scaffolding code. To address these conflicting needs, the same source code is compiled into multiple **build configurations** that differ in the use of compiler options and activation of the scaffolding code.
-
@subsection exa_sec_qm QM Models
Many example projects contain code auto-generated by the QM modeling tool. Such projects always contain the corresponding **QM model** file, which you can open in QM, modify, and re-generate the code.
@@ -257,7 +250,6 @@ Many example projects contain code auto-generated by the 3rd_party top-level folder.
@@ -272,9 +264,7 @@ The Third-Party software components included in the 3rd
sub-folders.
-
@subsection exa_own Creating your Own QP/C Projects
-
Perhaps the most important fact of life to remember is that in embedded systems nothing works until everything works. This means that you should always start with a working system and gradually evolve it, changing one thing at a time and making sure that it keeps working every step of the way.
Keeping this in mind, the provided QP/C application examples, such as the super-simple Blinky, or a bit more advanced @ref dpp or @ref game, allow you to get started with a working project rather than starting from scratch. You should also always try one of the provided example projects on the same evaluation board that it was designed for, before making any changes.
@@ -294,7 +284,6 @@ After copying the project folder, you still need to change the name of the proje
By copying and re-naming an existing, working project, as opposed to creating a new one from scratch, you inherit the correct compiler and linker options an other project settings, which will help you get started much faster.
-
@subsection exa_doc Next Steps and Further Reading About QP and QM
To work with QP/C effectively, you need to learn a bit more about active objects and state machines. Below is a list of links to enable you to further your knowledge:
@@ -311,9 +300,6 @@ To work with QP/C effectively, you need to learn a bit more about active objects
/*##########################################################################*/
/*! @page exa_ref Cross-Reference
-@tableofcontents
-
-
@section exa_ref_kernel Native Examples (by Built-in Kernel)
- @ref exa_qv
- @ref exa_qk
@@ -321,11 +307,6 @@ To work with QP/C effectively, you need to learn a bit more about active objects
@section exa_ref_tool Native Examples (by Development Toolchain)
-@n
-
-
-@subsection exa_ref_arm-keil ARM-Keil Toolchain (ARM Compiler 5)
-- @ref arm-cm_blinky_ek-tm4c123gxl (Cortex-M4)
@subsection exa_ref_arm-clang ARM-Clang Toolchain (ARM Compiler 6)
@@ -337,10 +318,8 @@ To work with QP/C effectively, you need to learn a bit more about active objects
- @ref arm-cm_dpp_nucleo-l152re (Cortex-M3)
- @ref arm-cm_game_efm32-slstk3401a (Cortex-M4)
- @ref arm-cm_dpp_stm32f4-discovery
-- @ref arm-cm_dpp_stm32f746g-disco (Cortex-M7)
- @ref arm-cm_dpp_nucleo-l053r8 (Cortex-M0+)
- @ref arm-cm_dpp_efm32-slstk3401a (Cortex-M4)
-- @ref arm-cm_dpp_stm32f746g-disco (Cortex-M7)
- @ref arm-cm_dpp_nucleo-h743zi (Cortex-M7)
@@ -354,16 +333,13 @@ To work with QP/C effectively, you need to learn a bit more about active objects
- @ref arm-cm_dpp_nucleo-l152re (Cortex-M3)
- @ref arm-cm_game_efm32-slstk3401a (Cortex-M4)
- @ref arm-cm_dpp_stm32f4-discovery
-- @ref arm-cm_dpp_stm32f746g-disco (Cortex-M7)
- @ref lwip_ek-lm3s6965 (Cortex-M3)
-- @ref arm7-9_dpp_at91sam7s-ek (ARM7TDMI)
@subsection exa_ref_gnu-ccs GNU-ARM with TI CCS IDE
- @ref arm-cm_dpp_ek-tm4c123gxl (Cortex-M4)
-
@subsection exa_ref_iar-arm IAR EWARM
- @ref arm-cm_blinky_ek-tm4c123gxl (Cortex-M4)
- @ref arm-cm_blinky_efm32-slstk3401a (Cortex-M4)
@@ -373,11 +349,9 @@ To work with QP/C effectively, you need to learn a bit more about active objects
- @ref arm-cm_dpp_nucleo-l053r8 (Cortex-M0+)
- @ref arm-cm_dpp_nucleo-l152re (Cortex-M3)
- @ref arm-cm_game_efm32-slstk3401a (Cortex-M4)
-- @ref arm-cm_dpp_stm32f746g-disco (Cortex-M7)
- @ref arm-cr_blinky_launchxl2-tms57012 (Cortex-R4)
- @ref arm-cr_dpp_launchxl2-tms57012 (Cortex-R4)
- @ref lwip_ek-lm3s6965 (Cortex-M3)
-- @ref arm7-9_dpp_at91sam7s-ek (ARM7TDMI)
@subsection exa_ref_ccs-430 CCS for MSP430
@@ -393,7 +367,6 @@ To work with QP/C effectively, you need to learn a bit more about active objects
@section exa_ref_native Native Examples (by Processor)
- @ref exa_arm-cm
- @ref exa_arm-cr
-- @ref exa_arm7-9 ("classic ARM")
- @ref exa_msp430 ("classic" MSP430 and "extended" MSP430x)
@@ -401,7 +374,7 @@ To work with QP/C effectively, you need to learn a bit more about active objects
- @ref exa_embos (SEGGER)
- @ref exa_freertos (Amazon Web Services)
- @ref exa_threadx (Express Logic)
-- @ref exa_ucos-ii (Micrium/SiLabs)
+- @ref exa_uc-os2 (Micrium/SiLabs)
@section exa_ref_os Examples for Workstations (Windows, Linux, MacOS)
@@ -419,7 +392,6 @@ The examples in the "workstation" directory are designed for workstations (runni
- @ref exa_emwin (SEGGER, a.k.a. uC/GUI by Micrium)
-
@section exa_ref_boards Examples by Development Board
The boards chosen for the examples are generally inexpensive and self-contained with minimal need for external hardware (such as external JTAG debuggers or power supplies). Also, all the selected boards provide a virtual COM port (ideally) or can be easily connected to a TTL-to-USB serial converter cable for @ref comp_qs "QS software tracing" output.
@@ -437,7 +409,7 @@ You can hover the mouse cursor over the
- @ref freertos_dpp_ek-tm4c123gxl (FreeRTOS kernel; ARM-KEIL, GNU-ARM, IAR-EWARM toolchains)
- @ref freertos_dpp_nucleo-h743zi (FreeRTOS kernel; ARM-KEIL, GNU-ARM, IAR-EWARM toolchains)
- @ref threadx_dpp_ek-tm4c123gxl (ThreadX kernel; IAR-EWARM toolchain)
-- @ref ucos-ii_dpp_ek-tm4c123gxl (uC/OS-II kernel; ARM-KEIL, GNU-ARM, IAR-EWARM toolchains)
+- @ref uc-os2_dpp_ek-tm4c123gxl (uC/OS-II kernel; ARM-KEIL, GNU-ARM, IAR-EWARM toolchains)
@anchor EFM32-SLSTK3401A
@@ -447,13 +419,11 @@ You can hover the mouse cursor over the
- @ref arm-cm_game_efm32-slstk3401a (QV, QK kernels; ARM-KEIL, GNU-ARM, IAR-EWARM toolchains; QWin-GUI emulation)
-
@anchor mbed-LPC1768
![mbed-LPC1768](bd_mbed-LPC1768.jpg)
- @ref arm-cm_dpp_mbed-lpc1768 (QV, QK kernels; ARM-KEIL, GNU-ARM, IAR-EWARM toolchains)
-
@anchor NUCLEO-L053R8
![NUCLEO-L053R8](bd_NUCLEO-L053R8.jpg)
- @ref arm-cm_dpp_nucleo-l053r8 (QV, QK, QXK kernels; ARM-KEIL, GNU-ARM, IAR-EWARM toolchains)
@@ -462,7 +432,7 @@ You can hover the mouse cursor over the
@anchor NUCLEO-L152RE
![NUCLEO-L152RE](bd_NUCLEO-L152RE.jpg)
- @ref arm-cm_dpp_nucleo-l152re (QV, QK kernels; ARM-KEIL, GNU-ARM, IAR-EWARM toolchains)
-- @ref ucos-ii_dpp_nucleo-l053r8 (uC/OS-II kernel; ARM-KEIL, IAR-EWARM toolchains)
+- @ref uc-os2_dpp_nucleo-l053r8 (uC/OS-II kernel; ARM-KEIL, IAR-EWARM toolchains)
@anchor exa_EK-LM3S6965
@@ -483,14 +453,12 @@ You can hover the mouse cursor over the
- @ref threadx_dpp_stm32f429-discovery (ThreadX kernel; IAR-EWARM toolchain)
-
@anchor STM32F746G-Discovery
![STM32F746G-Discovery](bd_STM32F746G-Disco.jpg)
- @ref arm-cm_dpp_stm32f746g-disco (QV, QK, QXK kernels; ARM-KEIL, GNU-ARM, IAR-EWARM toolchains)
- @ref freertos_dpp_stm32f746g-disco (FreeRTOS kernel; ARM-KEIL, GNU-ARM, IAR-EWARM toolchains)
-
@subsection exa_ref_arm-cr ARM Cortex-R Boards:
@anchor LAUNCHXL2-TMS57012
![LAUNCHXL2-TMS57012](bd_LAUNCHXL2-TMS57012.jpg)
@@ -498,12 +466,6 @@ You can hover the mouse cursor over the
- @ref arm-cr_dpp_launchxl2-tms57012 (QV, QK kernels; CCS-TI-ARM, IAR-EWARM toolchains)
-@subsection exa_ref_arm7-9 ARM7 Boards:
-@anchor AT91SAM7S-EK
-![AT91SAM7S-EK](bd_AT91SAM7S-EK.jpg)
-- @ref arm7-9_dpp_at91sam7s-ek (QV, QK kernels; IAR-EWARM toolchains)
-
-
@subsection exa_ref_msp430 MSP430 Boards:
@anchor MSP-EXP430F5529LP
![MSP-EXP430F5529LP](bd_MSP-EXP430F5529LP.jpg)
@@ -532,16 +494,12 @@ You can hover the mouse cursor over the
- ARM Cortex-R
- @ref arm-cr_blinky_launchxl2-tms57012
- @ref arm-cr_dpp_launchxl2-tms57012
-- ARM7 / ARM9
- - @ref arm7-9_dpp_at91sam7s-ek
- MSP430
- @ref msp430_blinky_msp-exp430f5529lp
- @ref msp430_dpp_msp-exp430f5529lp
@section exa_ref_vendor Examples by MCU Vendor
-- Atmel
- - @ref arm7-9_dpp_at91sam7s-ek
- NXP
- @ref arm-cm_dpp_mbed-lpc1768
- Silicon Labs
diff --git a/doxygen/exa_native.dox b/doxygen/exa_native.dox
index cec1bf15..d9d117c6 100644
--- a/doxygen/exa_native.dox
+++ b/doxygen/exa_native.dox
@@ -34,7 +34,7 @@ You can hover the mouse cursor over the
- @ref arm-cm_dpp_nucleo-h743zi
- @ref arm-cm_dpp_nucleo-l552ze
- @ref arm-cm_game_efm32-slstk3401a
-- @ref arm-cm_low-power
+- @ref tut_low
- @ref arm-cr_blinky_launchxl2-tms57012
- @ref arm-cr_dpp_launchxl2-tms57012
- @ref arm7-9_dpp_at91sam7s-ek
@@ -58,7 +58,7 @@ You can hover the mouse cursor over the
- @ref arm-cm_dpp_stm32f4-discovery
- @ref arm-cm_dpp_nucleo-h743zi
- @ref arm-cm_dpp_nucleo-l552ze
-- @ref arm-cm_low-power
+- @ref tut_low
- @ref arm-cr_blinky_launchxl2-tms57012
- @ref arm-cr_dpp_launchxl2-tms57012
- @ref arm7-9_dpp_at91sam7s-ek
@@ -77,7 +77,7 @@ You can hover the mouse cursor over the
- @ref arm-cm_dpp_stm32f4-discovery
- @ref arm-cm_dpp_nucleo-l552ze
- @ref arm-cm_dpp_nucleo-h743zi
-- @ref arm-cm_low-power
+- @ref tut_low
*/
/*##########################################################################*/
@@ -97,7 +97,7 @@ You can hover the mouse cursor over the
- @subpage arm-cm_dpp_nucleo-h743zi
- @subpage arm-cm_dpp_nucleo-l552ze
- @subpage arm-cm_game_efm32-slstk3401a
-- @subpage arm-cm_low-power
+- @ref tut_low
*/
/*##########################################################################*/
/*! @page exa_arm-cr ARM Cortex-R
@@ -130,8 +130,6 @@ You can hover the mouse cursor over the
/*##########################################################################*/
/*! @page arm-cm_blinky_ek-tm4c123gxl Blinky on EK-TM4C123GXL
-@tableofcontents
-
This example implements the @ref blinky "Blinky sample application" on the EK-TM4C123GLX board (ARM Cortex-M4F).
@@ -193,8 +191,6 @@ The Windows emulation is a simple console application that produces the followin
/*##########################################################################*/
/*! @page arm-cm_blinky_efm32-slstk3401a Blinky on EFM32-SLSTK3401A
-@tableofcontents
-
This example implements the @ref blinky "Blinky sample application" on the EFM32-SLSTK3401A board (ARM Cortex-M4F).
@@ -260,8 +256,6 @@ The Windows emulation is a simple console application that produces the followin
/*##########################################################################*/
/*! @page arm-cm_dpp_ek-tm4c123gxl DPP on EK-TM4C123GXL
-@tableofcontents
-
This example implements the @ref dpp "Dining Philosophers Problem" sample application on the EK-TM4C123GLX board (ARM Cortex-M4F).
@@ -357,14 +351,12 @@ The application also demonstrates
@image html bd_EFM32-SLSTK3401A.jpg EFM32-SLSTK3401A board
-The DPP example is located in the directory qpc/examples/arm-cm/dpp_efm32-slstk3401a and includes versions for @ref qv "cooperative QV kernel", the @ref qk "preemptive QK kernel", and the @ref qxk "preemptive dual mode QXK RTOS kernel" each provided for the ARM-KEIL, GNU-ARM, and IAR-ARM. The following annotated directory listing describes the contents of the example folder:
+The DPP example is located in the directory qpc/examples/arm-cm/dpp_efm32-slstk3401a and includes versions for @ref srs_qv "cooperative QV kernel", the @ref srs_qk "preemptive QK kernel", and the @ref srs_qxk "preemptive dual mode QXK RTOS kernel" each provided for the ARM-KEIL, GNU-ARM, and IAR-ARM. The following annotated directory listing describes the contents of the example folder:
@code{c}
qpc/ // QP/C installation directory
@@ -458,9 +450,9 @@ Dining Philosophers Problem (DPP) example for NXP LPC1768 MCU (Cortex-M3) with
@ref dpp "Dining Philosophers Problem (DPP)" example for STM32 NUCLEO-L053R8 MCU (Cortex-M0+).
Demonstrated built-in kernels:
-- cooperative @ref qv with ARM-Clang, ARM-Keil, GNU-ARM (Makefile and Atollic TRUEstudio), and IAR-ARM toolchains
-- preemptive, run-to-completion @ref qk with ARM-Clang, ARM-Keil, GNU-ARM, and IAR-ARM toolchains
-- dual-mode (run-to-completion/blocking) @ref qxk with ARM-Clang, ARM-Keil, GNU-ARM, and IAR-ARM toolchains
+- cooperative @ref srs_qv with ARM-Clang, ARM-Keil, GNU-ARM (Makefile and Atollic TRUEstudio), and IAR-ARM toolchains
+- preemptive, run-to-completion @ref srs_qk with ARM-Clang, ARM-Keil, GNU-ARM, and IAR-ARM toolchains
+- dual-mode (run-to-completion/blocking) @ref srs_qxk with ARM-Clang, ARM-Keil, GNU-ARM, and IAR-ARM toolchains
Features:
@@ -477,8 +469,8 @@ Features:
@ref dpp "Dining Philosophers Problem (DPP)" example for STM32 NUCLEO-L152RE MCU (Cortex-M3).
Demonstrated built-in kernels:
-- cooperative @ref qv with ARM-Clang, ARM-Keil, GNU-ARM, and IAR-ARM toolchains
-- preemptive, run-to-completion @ref qk with ARM-Clang, ARM-Keil, GNU-ARM, and IAR-ARM toolchains
+- cooperative @ref srs_qv with ARM-Clang, ARM-Keil, GNU-ARM, and IAR-ARM toolchains
+- preemptive, run-to-completion @ref srs_qk with ARM-Clang, ARM-Keil, GNU-ARM, and IAR-ARM toolchains
Features:
@@ -495,9 +487,9 @@ The @ref dpp "DPP example" for STM32F4-Discovery board is located directory The examples in the qpc/examples/workstation directory are designed for workstations (running Windows, Linux, or MacOS). Currently, the following examples are provided:
diff --git a/doxygen/exa_qutest.dox b/doxygen/exa_qutest.dox
index ca30bf3b..9bcfd3ff 100644
--- a/doxygen/exa_qutest.dox
+++ b/doxygen/exa_qutest.dox
@@ -1,7 +1,5 @@
/*! @page exa_qutest Examples for QUTest Unit Testing Harness
-@tableofcontents
-
The examples in the qpc/examples/qutest directory demonstrate how to test embedded code with the [QUTest](https://www.state-machine.com/qtools/qutest.html) unit testing harness. Currently, the following examples are provided:
diff --git a/doxygen/exa_rtos.dox b/doxygen/exa_rtos.dox
index b08159dc..e5c75187 100644
--- a/doxygen/exa_rtos.dox
+++ b/doxygen/exa_rtos.dox
@@ -6,10 +6,11 @@ The main purpose of integrating QP/C with conventional RTOSes is to enable you t
- @subpage exa_embos (directory examples/embos/)
- @subpage exa_freertos (directory examples/freertos/)
- @subpage exa_threadx (directory examples/threadx/)
-- @subpage exa_ucos-ii (directory examples/ucos-ii/)
+- @subpage exa_uc-os2 (directory examples/uc-os2/)
+- @subpage exa_zephyr (directory examples/zephyr/)
@note
-You do **not** need to use a third-party RTOS just to achieve preemptive multitasking with QP/C. The framework contains a selection of built-in real-time kernels, such as the cooperative @ref qv "QV kernel", the preemptive non-blocking @ref qk "QK kernel", and the preemptive, dual-mode, blocking @ref qxk "QXK kernel". Specifically, the QXK kernel has been designed specifically for mixing event-driven active objects with traditional **blocking code**, such as commercial middleware (TCP/IP stacks, UDP stacks, embedded file systems, etc.) or legacy software.
+You do **not** need to use a third-party RTOS just to achieve preemptive multitasking with QP/C. The framework contains a selection of built-in real-time kernels, such as the cooperative @ref srs_qv "QV kernel", the preemptive non-blocking @ref srs_qk "QK kernel", and the preemptive, dual-mode, blocking @ref srs_qxk "QXK kernel". Specifically, the QXK kernel has been designed specifically for mixing event-driven active objects with traditional **blocking code**, such as commercial middleware (TCP/IP stacks, UDP stacks, embedded file systems, etc.) or legacy software.
@next{exa_embos examples}
*/
@@ -232,7 +233,7 @@ The QP/C examples for ThreadX (Express Logic) are as follows:
@note
You can hover the mouse cursor over the icon in the list below to see the picture of the board.
-@next{exa_ucos-ii examples}
+@next{exa_uc-os2 examples}
*/
/*##########################################################################*/
/*! @page threadx_dpp_ek-tm4c123gxl DPP on EK-TM4C123GXL
@@ -262,7 +263,6 @@ The sub-directory iar contains the workspace and
After you load the DPP example into the STM32F4-Discovery board, the application should start blinking the 4 on-board LEDs. You can press the User button (blue) to PAUSE the philosophers for as long as the button is depressed. The philosophers resume dining when you release the User button. (In the PAUSED state the Table active object stops granting permissions to eat, so eventually all philosophers end in the "hungry" state.)
-
@section threadx_dpp_stm32f429-discovery_qs QS Software Tracing
The DPP example for ThreadX on STM32F4-Discovery board provides the "Spy" build configuration, which outputs the QS (Quantum Spy) software tracing data through USART2. To get the data out of the board, you need to connect the TTL/RS232 converter as follows:
@@ -288,17 +288,17 @@ qspy -cCOM1
The actual COM port number might be different on your Windows machine. Please check the Device Manager to find the COM port number.
-@next{exa_ucos-ii examples}
+@next{exa_uc-os2 examples}
*/
/*##########################################################################*/
-/*! @page exa_ucos-ii uC/OS-II
+/*! @page exa_uc-os2 uC-OS2
-The QP/C examples for uC/OS-II are as follows:
+The QP/C examples for uC-OS2 are as follows:
- ARM Cortex-M
- - @subpage ucos-ii_dpp_ek-tm4c123gxl (Cortex-M4F)
(ARM-CLANG, GNU-ARM and IAR EWARM toolsets)
- - @subpage ucos-ii_dpp_nucleo-l053r8 (Cortex-M0+)
(ARM-CLANG, GNU-ARM, and IAR EWARM toolsets)
+ - @subpage uc-os2_dpp_ek-tm4c123gxl (Cortex-M4F)
(ARM-CLANG, GNU-ARM and IAR EWARM toolsets)
+ - @subpage uc-os2_dpp_nucleo-l053r8 (Cortex-M0+)
(ARM-CLANG, GNU-ARM, and IAR EWARM toolsets)
@note
You can hover the mouse cursor over the icon in the list below to see the picture of the board.
@@ -306,7 +306,7 @@ You can hover the mouse cursor over the
@next{exa_os examples}
*/
/*##########################################################################*/
-/*! @page ucos-ii_dpp_ek-tm4c123gxl DPP on EK-TM4C123GXL
+/*! @page uc-os2_dpp_ek-tm4c123gxl DPP on EK-TM4C123GXL
@image html bd_EK-TM4C123GXL.jpg "EK-TM4C123GXL board"
@@ -314,10 +314,10 @@ DPP example for Texas Instruments TivaC123GXL MCU (Cortex-M4F) and ARM-CLANG, GN
@image html under_construction.jpg
-@next{ucos-ii_dpp_nucleo-l053r8 examples}
+@next{uc-os2_dpp_nucleo-l053r8 examples}
*/
/*##########################################################################*/
-/*! @page ucos-ii_dpp_nucleo-l053r8 DPP on STM32-NUCLEO-L053R8
+/*! @page uc-os2_dpp_nucleo-l053r8 DPP on STM32-NUCLEO-L053R8
@image html bd_NUCLEO-L053R8.jpg "STM32-NUCLEO-L053R8 board"
@@ -325,6 +325,129 @@ DPP example for STM32 L053R8 MCU (Cortex-M0+) and ARM-CLANG, GNU-ARM and IAR EWA
@image html under_construction.jpg
-@next{exa_os examples}
+@next{exa_zephyr examples}
+*/
+
+/*##########################################################################*/
+/*! @page exa_zephyr Zephyr
+
+The QP/C examples for Zephyr are as follows:
+
+- @subpage zephyr_blinky
+- @subpage zephyr_dpp
+
+@next{zephyr_blinky}
+*/
+/*##########################################################################*/
+/*! @page zephyr_blinky Blinky
+
+Blinks an on-board LED once per second.
+
+The blinking is done by an Active Object (Blinky) with a state machine.
+
+@section zephyr_blinky-build Building and Running
+
+- Linux:
+Open a terminal in the blinky directory.
+
+@verbatim
+source ~/zephyrproject/zephyr/zephyr-env.sh
+
+west build -b
+
+west flush
+@endverbatim
+
+@section zephyr_blinky-output Sample Output
+Once flashed to the board, the application also produces ASCII output to the serial terminal (if supported by the board):
+
+@verbatim
+*** Booting Zephyr OS build v2.6.0-rc2-88-g3d39f72a88b3 ***
+BSP_ledOff
+QF_onStartup
+BSP_ledOn
+BSP_ledOff
+BSP_ledOn
+BSP_ledOff
+@endverbatim
+
+@note
+The example has been tested with the following boards:
+
+![STM32-NUCLEO-L053R8 board](bd_NUCLEO-L053R8.jpg)
+
+
+![STM32-NUCLEO-H743ZI board](bd_NUCLEO-H743ZI.jpg)
+
+@note
+The example should also work with most boards supported by Zephyr.
+
+@section zephyr_blinky-limits Limitations
+The simple Blinky example does not support the QS software tracing.
+
+@next{zephyr_dpp}
+*/
+/*##########################################################################*/
+/*! @page zephyr_dpp DPP
+
+DPP example with multiple active objects.
+
+@section zephyr_dpp-build Building and Running
+
+- Linux:
+Open a terminal in the dpp directory.
+
+@verbatim
+source ~/zephyrproject/zephyr/zephyr-env.sh
+
+west build -b
+
+west flush
+@endverbatim
+
+@section zephyr_dpp-output Sample Output
+Once flashed to the board, the application also produces ASCII output to the serial terminal (if supported by the board):
+
+@verbatim
+*** Booting Zephyr OS build v2.6.0-rc2-88-g3d39f72a88b3 ***
+Philo[4]->thinking
+Philo[3]->eating
+Philo[1]->thinking
+Philo[0]->eating
+Philo[4]->hungry
+Philo[3]->thinking
+Philo[2]->eating
+Philo[1]->hungry
+Philo[0]->thinking
+Philo[4]->eating
+Philo[3]->hungry
+Philo[0]->hungry
+Philo[4]->thinking
+Philo[0]->eating
+Philo[2]->thinking
+Philo[3]->eating
+Philo[4]->hungry
+Philo[2]->hungry
+Philo[3]->thinking
+Philo[2]->eating
+Philo[0]->thinking
+@endverbatim
+
+@note
+The example has been tested with the following boards:
+
+![STM32-NUCLEO-L053R8 board](bd_NUCLEO-L053R8.jpg)
+
+
+![STM32-NUCLEO-H743ZI board](bd_NUCLEO-H743ZI.jpg)
+
+@note
+The example should also work with most boards supported by Zephyr.
+
+@section zephyr_dpp-limits Limitations
+The DPP example currently does not support the QS software tracing,
+because implementation of the QS output over UART is board dependent. However, for a specific board, re-implementing the QS callbacks should be straightforward.
+
+@next{exa_os}
*/
diff --git a/doxygen/gs.dox b/doxygen/gs.dox
index 2a752929..1bdce2f1 100644
--- a/doxygen/gs.dox
+++ b/doxygen/gs.dox
@@ -1,21 +1,26 @@
/*! @page gs Getting Started
-@nav{index,gs_get}
The following sections describe how to get started with QP™/C quickly:
- @subpage gs_get
-- @subpage gs_over
- @subpage gs_tut
The YouTube Video Getting Started with QP™ Frameworks provides instructions on how to download, install and get started with QP quickly.
[![Video: Getting Started with QP™ Real-Time Embedded Framework](gs-video.jpg)](https://youtu.be/O7ER6_VqIH0)
+@note
+
+Information about the QP/C functionality, architecture, design, and other aspects is provided in the [Certification Package](modules.html):
+- @ref srs — QP/C functionality
+- @ref sas — QP/C architecture
+- @ref sds — QP/C design
+- @ref misra — QP/C compliance with MISRA-C
+
@nav{index,gs_get}
*/
/*##########################################################################*/
/*! @page gs_get Downloading & Installing QP™/C
-@tableofcontents
-@nav{gs,gs_over}
+@nav{gs,gs_tut}
@section gs_bundle Downloading QP™/C in QP™-Bundle
The most recommended way of obtaining QP™/C™ is by downloading the @webref{#Downloads, QP-bundle™}, which includes QP™/C as well as other QP™ frameworks and also the @webref{products/qm, QM™ modeling tool} and the @webref{products/qtools, QTools™ collection}. The main advantage of obtaining QP™/C bundled together like that is that you get all components, tools and examples ready to go.
@@ -23,20 +28,17 @@ The most recommended way of obtaining QP™/C™ is by downloading the @
[![QP-bundle Downloads](qp-bundle.png)](https://www.state-machine.com/#Downloads)
@note
-
+
If you are allergic to installers and GUIs or don't have administrator privileges you can also **download and install QP™/C separately** from the QP™/C GitHub repository, as described in the next section.
@section gs_gh Downloading QP™/C from GitHub
Go to the QP™/C release page on GitHub, and choose the QP™/C version number you wish to download. You should select the latest QP™/C version, unless you have a very specific reason to go with an older release.
-Inside the release directory (e.g., `6.9.3`), you need to choose the QP™/C archive for your platform. QM™ is available for Windows (`qpc_-win32.zip`), Linux (`qpc_-linux64.zip`), and MacOS (`qm_-macx64.dmg`).
-
![QP™/C downloads from GitHub](qpc_gh.jpg)
@section gs_dir QP™/C Installation Folder
-
The following annotated directory tree lists the top-level directories provided in the standard QP™/C distribution.
@@ -56,96 +58,18 @@ The following annotated directory tree lists the top-level directories provided
+@attention
+The QP/C GitHub repository does not contain the `3rd_party` folder, which is needed to build the @ref exa "QP™/C Examples". Therefore, it is highly **recommended** to download the latest [QP/C Release](https://github.com/QuantumLeaps/qpc/releases) as opposed to cloning the repo directly.
+
@remark
-The standard QP™/C distribution contains many @ref exa "Example Projects", which are specifically designed to help you learn to use QP™/C and to serve you as starting points for your own projects.
+The standard QP™/C distribution contains the `examples` folder with many @ref exa "Example Projects", which are specifically designed to help you learn to use QP™/C and to serve you as starting points for your own projects.
-
-@nav{gs,gs_over}
-*/
-/*##########################################################################*/
-/*! @page gs_over QP™/C Overview
-@nav{gs_get,gs_tut}
-@tableofcontents
-
-This section gives a quick, high-level overview of the QP™ framework and its context of use. The main purpose is to provide the links to the more detailed information available in this QP™/C Manual.
-
-@section gs_struct General System Structure
-The block diagram below illustrates the general system architecture based on the QP™/C framework:
-
-![General system architecture based on QP™/C](qp_comp.jpg)
-
-
-@note
-The following sections describe the system structure from top to bottom because this is the order most relevant for the development of **QP™ Applications**.
-
-
-@section gs_app QP™ Application
-The **QP™ Application** consists of event-driven @webref{active-object, Active Objects}. The application is not a part of QP™, but rather is *derived* from the QP™ framework that supplies the @ref api "API" for building the application as well as runtime environment to execute it on an embedded target.
-
-@sa
-- @ref srs_app "Application Requirements"
-- @ref exa "Application Examples"
-
-
-@section gs_qep QEP State Machine Processor
-The QEP component provides services related to event-driven **State Machines**. This is the most relevant QP™ layer for the application developers, because they spend most of their time elaborating the state machines of their Active Objects.
-
-@sa
-- @ref srs_evt "Event Requirements"
-- @ref srs_sm "State Machine Overview & Requirements"
-- @ref sas_sm "State Machine Architecture"
-- @ref sds_sm "State Machine Design & Implementation"
-
-
-@section gs_qf QF Active Object Framework
-The QF component provides services related to **Active Objects** like: asynchronous event passing, queuing of events, publish-subscribe, time events, deterministic event pools for mutable events, etc. These services form the core of the QP™ framework, which provides the Run-To-Completion (RTC) execution context for the Active Objects and their internal state machines. The application developers often use the Active Object services in the *actions* executed by the state machines.
-
-@sa
-- @ref srs_ao "Active Object Overview & Requirements"
-- @ref sas_ao "Active Object Architecture"
-- @ref sds_ao "Active Object Design & Implementation"
-
-
-@section gs_kernel Real-Time Kernels/RTOS/GPOS
-The QP™ framework can run standalone with one of the provided built-in kernels or it can run on top of a traditional, 3rd-party RTOS, or on top of a general-purpose OS.
-
-
-@subsubsection gs_kernel-builtin Built-in Real-Time Kernels
-The QP™ framework contains a selection of built-in real-time kernels, such as:
-- the cooperative QV kernel (see @ref srs_qv_intro "QV Kernel Theory of Operation"),
-- the preemptive non-blocking QK kernel (see @ref srs_qk_intro "QK Kernel Theory of Operation"), and
-- the preemptive, dual-mode, blocking QXK kernel (see @ref srs_qxk_intro "QXK Kernel Theory of Operation").
-
-
-@subsection gs_kernel-rtos 3rd-Party RTOS Kernels
-QP™ can also work with many 3rd-party RTOSes, such as:
-- @ref embos "embOS (SEGGER)"
-- @ref freertos "FreeRTOS (AWS)"
-- @ref threadx "ThreadX (Microsoft)"
-- @ref ucos-ii "uC/OS-II (Silicon Labs)"
-
-
-@subsection gs_kernel-gpos General-Purpose Operating Systems
-Finally, QP™ can also work with general-purpose operating systems, such as:
-- @ref posix "POSIX (Linux, QNX, VxWorks, Integrity, etc.)"
-- @ref win32 "Windows".
-
-
-@section gs_qs QS Software Tracing
-The QS component provides special instrumentation inside QP that can produce detailed information from the execution of the QP Application. This information, produced in live system can be valuable for debugging, fine-tuning and testing of the QP Applications.
-
-@sa
-- @ref srs_qs "Software Tracing Overview & Requirements"
-- @ref sas_qs "Software Tracing Architecture"
-- @ref sds_qs "Software Tracing Design & Implementation"
-
-
-@nav{gs_get,gs_tut}
+
+@nav{gs,gs_tut}
*/
/*##########################################################################*/
/*! @page gs_tut QP™/C Tutorial
-@tableofcontents
-@nav{gs_over,tut_blinky}
+@nav{gs_get,tut_blinky}
This Tutorial describes how to use the QP/C™ real-time embedded framework in a series of progressively advancing examples. The first example ("Blinky") uses only one Active Object with a simple non-hierarchical state machine. The following example ("DPP") demonstrates multiple, communicating Active Objects. Finally, the last example ("Fly'n'Shoot" game) demonstrates all features the QP™ framework. It is highly recommended to study the simpler examples before the more advanced ones, as the basic information won't be repeated in the later examples.
@@ -170,11 +94,10 @@ By copying and re-naming an existing, working project, as opposed to creating a
from scratch, you inherit the correct compiler and linker options an other project settings, which will help you get started much faster.
-@nav{gs_over,tut_blinky}
+@nav{gs_get,tut_blinky}
*/
/*##########################################################################*/
/*! @page tut_blinky Simple Blinky Application
-@tableofcontents
@nav{gs_tut,tut_dpp}
The ultra-simple Blinky example is the embedded systems' equivalent of the venerable "Hello World!" program, that is, the simplest possible working QP™ application that does "something". In the case of Blinky, this "something" is blinking an LED at the rate of 1Hz, where an LED turns on and remains on for 0.5 seconds on then turns off and remains off for 0.5 seconds.
@@ -198,11 +121,11 @@ The details of the Blinky application are describe in the Quantum Leaps Applicat
[![Application Note: Getting Started with QP™](AN-getting_started.jpg)](https://www.state-machine.com/doc/AN_Getting_Started_with_QP.pdf)
+
@nav{gs_tut,tut_dpp}
*/
/*##########################################################################*/
/*! @page tut_dpp Dining Philosophers Problem (DPP)
-@tableofcontents
@nav{tut_blinky,tut_game}
The Dining Philosophers Problem (DPP) example is an intermediate-level application with *multiple* active objects. It illustrates the following QP™ features, such as:
@@ -224,11 +147,10 @@ The Dining Philosophers Problem (DPP) example is described in the @webref{doc/AN
[![Application Note: Dining Philosophers Problem (DPP) Example](AN_DPP.jpg)](https://www.state-machine.com/doc/AN_Fly-n-Shoot.pdf)
-
@note
There is also a DPP variant that implements the "Philosophers" as passive "Orthogonal Components" of the "Table" active object. That DPP version is located in qpc/examples/examples/workstation/dpp-comp/
-
+
@nav{tut_blinky,tut_game}
*/
/*##########################################################################*/
@@ -259,15 +181,14 @@ The "Fly 'n' Shoot" game example is described in the @webref{doc/AN_Fly-n-Shoot.
[!["Fly'n'Shoot" game tutorial video](game-video.jpg)](https://youtu.be/h_u92uLssDo)
-
+
@nav{tut_dpp,tut_low}
*/
/*##########################################################################*/
/*! @page tut_low Low-Power Example
-@tableofcontents
-@nav{tut_game,srs}
+@nav{tut_game,exa}
-The main principle of low-power design for software is to keep the hardware in the most appropriate low-power sleep mode for as long as possible. Most commonly, the software enters a low-power sleep mode from the **idle callback** (a.k.a. "idle hook"), which is called when the software has nothing left to do and is waiting for an interrupt to deliver more work. The QP/C and QP/C++ Real-Time Embedded Frameworks (RTEFs) support the *idle callback* in all of the built-in real-time kernels, such as the cooperative @ref qv "QV kernel", the preemptive non-blocking @ref qk "QK kernel" and the preemptive blocking @ref qxk "QXK kernel". Also, such an *idle callback* is provided in all 3rd-party traditional RTOS kernels that QP/C/C++ have been @ref ports_rtos "ported to".
+The main principle of low-power design for software is to keep the hardware in the most appropriate low-power sleep mode for as long as possible. Most commonly, the software enters a low-power sleep mode from the **idle callback** (a.k.a. "idle hook"), which is called when the software has nothing left to do and is waiting for an interrupt to deliver more work. The QP/C and QP/C++ Real-Time Embedded Frameworks (RTEFs) support the *idle callback* in all of the built-in real-time kernels, such as the cooperative @ref srs_qv "QV kernel", the preemptive non-blocking @ref srs_qk "QK kernel" and the preemptive blocking @ref srs_qxk "QXK kernel". Also, such an *idle callback* is provided in all 3rd-party traditional RTOS kernels that QP/C/C++ have been @ref ports_rtos "ported to".
@remark
Design for low-power is a broad subject that requires a holistic system approach to achieve a really long battery-powered operation. This example covers only certain *software-related* aspects of the problem.
@@ -299,7 +220,6 @@ The support for multiple static clock tick rates is much *simpler* than the "dyn
Yet the *multiple clock rates* can deliver similar low-power operation for the system, while keeping the QP framework much simpler and easier to certify than "tickless" kernels. The rest of this example explains how to use the multiple static clock rates in QP/C/C++ and shows how to leverage this feature to achieve low-power software design.
-
@section arm-cm_low_power_app The Low-Power Example Application
The low-power example is located in QP/C and QP/C++ distributions, in the directory with the following structure:
@@ -398,7 +318,6 @@ The **Idle** callback turns the **slow tick rate-0** off. The system enters the
The **Idle** line (Red-LED) goes down twice as fast as the changes in the state of the **Green-LED** or the **Blue-LED**. This is because the application uses timeouts of **2 clock ticks** for toggling these lines instead of just one clock tick, which then could be slower. This is not quite optimal for the energy dissipation (as the CPU is woken up twice as often as it needs to be), but it illustrates more accurately how the fixed clock rates work as well as the one-tick delay to enter the low-power sleep mode from the idle callback.
-
@subsection arm-cm_low_power_sm State Machines
The versions of this low-power example for the **QK** and **QV** kernels use two active objects **Blinky0** and **Blinky1**, which toggle the **Green-LED** at the slow tick rate 0, and the **Blue-LED** at the fast tick rate 1, respectively. The state machines of the Blinky0 and Blinky1 active objects are shown below:
@@ -415,11 +334,10 @@ Similarly, the **Blinky1** state machine, in the entry action to the "active" st
-
@subsection arm-cm_low_power_xt Extended Thread (QXK)
The version of this low-power example for the **QXK** kernel uses one active object **Blinky0** (with the state machine shown above), but instead of the Blinky1 active object, the QXK version uses an eXtended thread (::QXThread) called **XBlinky1**, with the code shown below:
-@code{c}
+@code{.c}
#include "qpc.h"
#include "low_power.h"
#include "bsp.h"
@@ -475,7 +393,7 @@ The version of this low-power example for the **QXK** kernel uses one active obj
@subsection arm-cm_low_power_idle The Idle Callback (QK/QXK)
The most important functionality in this low-power example is implemented in the **idle callback** located in the BSP (Board Support Package). The idle callback QK_onIdle() for the preemptive QK kernel and the idle callback QXK_onIdle() for the QXK kernel are almost identical and are explained in this section.
-@code{c}
+@code{.c}
[0] void QXK_onIdle(void) {
[1] QF_INT_DISABLE();
@@ -541,7 +459,7 @@ The most important functionality in this low-power example is implemented in the
@subsection arm-cm_low_power_idle-qv The Idle Callback (QV)
The idle callback QV_onIdle() for the cooperative QV kernel is slightly different, because it is called with interrupts **disabled**. The following listing shows the complete QV_onIdle() callback, with the most important points explained in the section below:
-@code{c}
+@code{.c}
[0] void QV_onIdle(void) { /* NOTE: called with interrupts DISABLED */
[1] if (((l_activeSet & (1U << SYSTICK_ACTIVE)) != 0U) /* rate-0 enabled? */
@@ -579,7 +497,7 @@ The idle callback QV_onIdle() for the cooperative QV kernel is slightly differen
3 The QV_CPU_SLEEP() macro enters **low-power sleep mode** with interrupts still disabled. This port-specific macro is designed to re-anable interrupts **atomically** with entering the sleep mode.
-
-@nav{tut_game,srs}
+
+@nav{tut_game,exa}
*/
diff --git a/doxygen/history.dox b/doxygen/history.dox
index 7966fcff..c8437fc4 100644
--- a/doxygen/history.dox
+++ b/doxygen/history.dox
@@ -1,18 +1,84 @@
-/**
-@page history Revision History
+/*! @page history Revision History
+
+@section qpc_7_0_1 Version 7.0.1, 2022-07-31
+This release is the first one that contains the complete [QM model](https://www.state-machine.com/products/qm) of the QP/C framework (in the file `qpc/qpc.qm`). This model is then used to **generate all QP/C source code**:
+- `qpc/`
+ + @ref C:/qp-dev/qpc/include "include"
+ + @ref C:/qp-dev/qpc/src "src"
+
+The QM model of QP/C explicitly captures the *logical design* of the framework, which is then mapped to the preexisting [physical design](https://www.state-machine.com/qm/ce.html#ce_phys). The *logical design*, which consists of packages (some associated with namespaces), classes, types, and macros traces explicitly to the @ref sas "Software Architecture Specification (SAS)" and is easier to manipulate and refactor.
+
+__Source Code Changes:__
+- The whole QP/C source code is now generated from the `qpc.qm` model.
+- Refactored classes with only static members (QF, QV, QK, QXK, QS) into "namespaces".
+- Refactored:
+ + QF_TICK_X() -> QTIMEEVT_TICK() (see also QTimeEvt_tick_())
+ + QF_PUBLISH() -> QACTIVE_PUBLISH() (see also QActive_publish_())
+ + QF_psInit() -> QActive_psInit()
+
+@note
+The old APIs (QF_PUBLISH(), QF_TICK_X(), QF_psInit()) are still provided, but are tagged as [deprecated](deprecated.html).
+
+- Moved package-scope header files qf_pkg.h and qs_pkg.h from the `qpc/src` directory to `qpc/include`. This allows the build process to specify only the `qpc/include` directory to build applications and QP/C source code. Previously, the build process had to specify additionally `qpc/src`, but this is no longer needed.
+
+@note
+This change allowed all provided examples to be simplified by removing the `qpc/src` include directory from the various project files.
+
+__Ports/Examples:__
+- Removed port and examples for the older ARM7/ARM9
+- Added port to the @ref zephyr "Zephyr RTOS"
+- Added examples for the @ref exa_zephyr "Zephyr RTOS"
+- redesigned QP/C @ref freertos "port to FreeRTOS", see `qpc/ports/freertos`
+- slightly improved QP/C @ref threadx "port to ThreadX", see `qpc/ports/threadx`
+
+__Improved Documentation:__
+The Doxygen documentation has been re-structured and improved. Also the more attractive styling of the HTML has been applied.
+
@section qpc_7_0_0 Version 7.0.0, 2022-04-30
+This QP/C release changes the QP/C implementation from C89 to C99 and also improves compliance of the QP/C source code with MISRA:C-2012 (a.k.a. MISRA3). Also, major focus of this release is the adaptation of the code and documentation to better support safety certification (see [QP Certification Pack](modules.html))
+__Modified QP/C source code:__
+- updated QP/C source code for C99
+
+@note
+The QP/C source code requires C99 minimum and no longer compiles as C89.
+
+- made the QP/C source code compliant with MISRA:C-2012, C99 variant
+- made the compliant with the updated [Quantum Leaps Embedded C/C++ Coding Style (QL-C/C++:2022)](https://github.com/QuantumLeaps/embedded-coding-style)
+- added traceability links between QP/C source code and requirements, architecture, design, and MISRA deviation permits.
+- modified the top-level file comments now have standard-compliant license specification (SPDX-License-Identifiers). This allows QP/C to be included in automatic generation of Software Bill Of Materials (SBOM).
+
+__Modified QP/C ports:__
+- modified the QK and QXK ports to ARM Cortex-M to allow compile-time selection between using either NMI or an unused IRQ (via macro QK_USE_IRQ_HANDLER) as a mechanism to return to the thread mode
- removed unused `ARM_ARCH` symbol from Makefiles for GNU-ARM
-- restructured the Doxygen documentation
- + introudced new styling for the HTML documentation
- + updated links in the documentation
+- fixed the following bugs in QXK port to ARM Cortex-M
+ + [bug#305 Floating-point context corruption in QXK](https://sourceforge.net/p/qpc/bugs/305)
+ + [bug#306 QXK_ON_CONTEXT_SW option is not compatible with soft-float](https://sourceforge.net/p/qpc/bugs/306)
+
+__Removed QP/C ports:__
+- removed QP/C port to PIC24/dsPIC with XC16 (not compatible with C99)
+
+__Modified GitHub repository:__
+- removed the `3rd_party` directory from the [qpc GitHub repository](https://github.com/QuantumLeaps/qpc) to avoid tracking changes caused by updates to the 3rd-party components. (The QP/C releases still have the `3rd_party` directory, because it is needed for building the examples).
+
+__Added/Modified examples:__
+- modified examples for ARM Cortex-M7 (to integrate better with STM32CubeH7)
+- added examples for ARM Cortex-M33 (for STM32 NUCLEO-L552ZE and STM32CubeL5)
+- added `qutest` examples for Unity (comparison between Unity and QUTest)
+
+__Modified QP/C documentation:__
+- restructured the Doxygen documentation for traceability
+- added the @ref gs_tut "QP/C Tutorial"
+- added the @ref srs "QP Certification Pack"
+
+@remark
+The [QP Certification Pack](https://www.state-machine.com/products/qp#CERT) is still work in progress in this release, but the remaining work is limited to documentation only and no code restructuring is anticipated for that.
@section qpc_6_9_3 Version 6.9.3, 2021-04-12
-
__Feature Requests:__
-- [feature#191 "Add QS local filtering to QF_PUBLISH()"](https://sourceforge.net/p/qpc/feature-requests/191/)
+- [feature#191 "Add QS local filtering to QF_PUBLISH()"](https://sourceforge.net/p/qpc/feature-requests/191)
The feature has been implemented by means of the "sender" parameter of the `QF_PUBLISH()` macro, which must now be a pointer to a struct that has the `prio` member. This design enables applying QS local filter to the `prio` as the QS-Id. This works for publishing events from active objects. For publishing events outside active objects (e.g., from ISRs), the header file `qs.h` provides a type `QSpyId`, which should be used to define QS ID variables to be used as "sender" in `QF_PUBLISH()`.
@@ -20,15 +86,15 @@ The feature has been implemented by means of the "sender" parameter of the `QF_P
This change only affects the Spy build configuration, where the QS software tracing instrumentation is enabled. The existing code could require modifications to provide "sender" pointer that can access `prio` directly. For example, AOs would need to call `QF_PUBLISH(e, &me->super)` instead of `QF_PUBLISH(e, me)`.
-- [feature#185 "Add possibility of assigning name to AO threads in QP-RTOS ports"](https://sourceforge.net/p/qpc/feature-requests/185/)
+- [feature#185 "Add possibility of assigning name to AO threads in QP-RTOS ports"](https://sourceforge.net/p/qpc/feature-requests/185)
-This feature request is now implemented uniformely in all QP-ports to 3rd-party RTOSes by means of the generic QP API QActive_setAttr(). Specifically, the QP port will allow you to set the thread name by calling QActive_setAttr() before calling QACTIVE_START().
+This feature request is now implemented uniformly in all QP-ports to 3rd-party RTOSes by means of the generic QP API QActive_setAttr(). Specifically, the QP port will allow you to set the thread name by calling QActive_setAttr() before calling QACTIVE_START().
__Bug Fixes:__
-- [bug#292 "QP-C-C++ on 64 Bit Linux - Setting of Current-Obj - AO_Obj from QView raises segmentation fault"](https://sourceforge.net/p/qpc/bugs/292/)
-- [bug#293 "[Qpccp 6.9.2] test of assertion fail now"](https://sourceforge.net/p/qpc/bugs/293/)
-- [bug#298 "ARM Cortex-M Erratum 838869 Handled Inconsistently in Ports"](https://sourceforge.net/p/qpc/bugs/298/)
+- [bug#292 "QP-C-C++ on 64 Bit Linux - Setting of Current-Obj - AO_Obj from QView raises segmentation fault"](https://sourceforge.net/p/qpc/bugs/292)
+- [bug#293 "[Qpccp 6.9.2] test of assertion fail now"](https://sourceforge.net/p/qpc/bugs/293)
+- [bug#298 "ARM Cortex-M Erratum 838869 Handled Inconsistently in Ports"](https://sourceforge.net/p/qpc/bugs/298)
__Source code changes:__
@@ -39,10 +105,10 @@ __Source code changes:__
__Modified QP/C ports:__
-- `qpc/ports/arm-cm/` - fixed [bug#298](https://sourceforge.net/p/qpc/bugs/298/)
-- `qpc/ports/embos/` - implemented [feature#185](https://sourceforge.net/p/qpc/feature-requests/185/)
-- `qpc/ports/threadx/` - implemented [feature#185](https://sourceforge.net/p/qpc/feature-requests/185/)
-- `qpc/ports/ucos2/` - implemented [feature#185](https://sourceforge.net/p/qpc/feature-requests/185/)
+- `qpc/ports/arm-cm/` - fixed [bug#298](https://sourceforge.net/p/qpc/bugs/298)
+- `qpc/ports/embos/` - implemented [feature#185](https://sourceforge.net/p/qpc/feature-requests/185)
+- `qpc/ports/threadx/` - implemented [feature#185](https://sourceforge.net/p/qpc/feature-requests/185)
+- `qpc/ports/ucos2/` - implemented [feature#185](https://sourceforge.net/p/qpc/feature-requests/185)
- `qpc/ports/win32/` - added QSpy64 (64-bit) build configuration to the Visual Studio project
- `qpc/ports/win32-qv/` - added QSpy64 (64-bit) build configuration to the Visual Studio project
- `qpc/ports/win32-quit/` - added "port" used for "QP Unit Internal Testing" (QUIT)
@@ -50,7 +116,7 @@ __Modified QP/C ports:__
__Updated examples:__
- all examples using `QF_PUBLISH()` - adjusted the `sender` parameter of the macro to have the `prio` member
-- `qpc/examples/arm-cm/` - fixed [bug#298](https://sourceforge.net/p/qpc/bugs/298/) (added calls to `QV|QK|QXK_ARM_ERRATUM_838869()`)
+- `qpc/examples/arm-cm/` - fixed [bug#298](https://sourceforge.net/p/qpc/bugs/298) (added calls to `QV|QK|QXK_ARM_ERRATUM_838869()`)
- `qpc/examples/qutest/self_test/test/` - added examples of the Python include files (`*.pyi`) for the new [include command](https://www.state-machine.com/qtools/namespacequtest__dsl.html).
- `qpc/examples/arm-cm/dpp_efm32-slstk3401a/win32-gui/` - corrected handling of user-drawn buttons in `bsp.c`
- `qpc/examples/arm-cm/game_efm32-slstk3401a/win32-gui/` - corrected handling of user-drawn buttons in `bsp.c`
@@ -60,11 +126,10 @@ __Updated 3rd-Party Components:__
- `qpc/3rd_party/threadx` to version 6.1.6 (latest open source version from [GitHub](https://github.com/azure-rtos/threadx) )
-
@section qpc_6_9_2 Version 6.9.2, 2021-01-18
The main purpose of this release is a redesign of the QS-RX (software tracing input) to implement the feature request #187:
-- [feature#187 "Make the byte order in QS-RX buffer compatible with DMA"](https://sourceforge.net/p/qpc/feature-requests/187/)
+- [feature#187 "Make the byte order in QS-RX buffer compatible with DMA"](https://sourceforge.net/p/qpc/feature-requests/187)
Additionally, as part of the re-design of the internal QS-RX implementation, this release fixes the bug #287 ("QS_rxGetNfree() returns too low value", see the "Bug Fixes" section)
@@ -108,11 +173,11 @@ __Updated examples:__
__Bug Fixes:__
-- [bug#289 "QS_OBJ_PTR() macro does not compile on 64-bit machine"](https://sourceforge.net/p/qpc/bugs/289/)
-- [bug#288 "POSIX port does not compile in Spy build configuration"](https://sourceforge.net/p/qpc/bugs/288/)
-- [bug#287 "QS_rxGetNfree() returns too low value"](https://sourceforge.net/p/qpc/bugs/287/)
-- [bug#285 "QView bug with querying the state of QMsm-type state machines"](https://sourceforge.net/p/qpc/bugs/285/)
-- [bug#284 "Typo in QM generated headers"](https://sourceforge.net/p/qpc/bugs/284/)
+- [bug#289 "QS_OBJ_PTR() macro does not compile on 64-bit machine"](https://sourceforge.net/p/qpc/bugs/289)
+- [bug#288 "POSIX port does not compile in Spy build configuration"](https://sourceforge.net/p/qpc/bugs/288)
+- [bug#287 "QS_rxGetNfree() returns too low value"](https://sourceforge.net/p/qpc/bugs/287)
+- [bug#285 "QView bug with querying the state of QMsm-type state machines"](https://sourceforge.net/p/qpc/bugs/285)
+- [bug#284 "Typo in QM generated headers"](https://sourceforge.net/p/qpc/bugs/284)
__Updated 3rd-Party Components:__
@@ -171,7 +236,7 @@ Additionally, this release introduces the new pre-defined QS record #QS_QF_NEW_A
The reversal of #QS_QF_NEW and #QS_QF_MPOOL_GET trace records has implications for the existing [QUTest test scripts](https://www.state-machine.com/qtools/qutest_script.html), where the order of expectations for "QF-New" and "MP-Get" needs to be reversed as well.
-Additionally, this release modifies the @ref qxk "QXK" source code, so that the `QActive.prio` attribute is the fixed priority assigned in QActive_start(), while `QActive.dynPrio` is the "dynamic" priority that can be changed when a @ref qxk_extended "QXK extended thread" acquires a @ref ::QXMutex "mutex".
+Additionally, this release modifies the @ref srs_qxk "QXK" source code, so that the `QActive.prio` attribute is the fixed priority assigned in QActive_start(), while `QActive.dynPrio` is the "dynamic" priority that can be changed when a @ref srs_qxk_extended "QXK extended thread" acquires a @ref ::QXMutex "mutex".
__Updated Ports:__
@@ -240,9 +305,7 @@ __Bug Fixes:__
+ [bug#276 "QP/C/C++ POSIX port doesn't set thread priorities correctly"](https://sourceforge.net/p/qpc/bugs/276)
-
@section qpc_6_8_2 Version 6.8.2, 2020-07-17
-
__Source code changes:__
- Changed definitions of ::QMsm, ::QMActive, and ::QTicker "classes" from using typedef's to using struct's. This means that ::QMsm, ::QMActive, and ::QTicker are now **distinct types** different from the respective base classes: ::QHsm, ::QActive, and ::QActive. Consequently, implicit conversions to the base class are *no longer performed*, which improves the type safety.
@@ -259,7 +322,7 @@ This change might cause compiler warning in code that assumes equivalence betwee
__Updated Ports:__
+ enabled #QF_ACTIVE_STOP in the ports: Win32, Win32-QV, Win32-QUTEST, POSIX, POSIX-QV, and POSIX-QUTEST.
- + @ref ucos-ii "port to uC/OS-II" has been adapted to the new uC/OS-II v2.93.00 (recently released by Silicon Labs under the open source Apache 2.0 license).
+ + @ref uc-os2 "port to uC/OS-II" has been adapted to the new uC/OS-II v2.93.00 (recently released by Silicon Labs under the open source Apache 2.0 license).
__Updated Examples:__
@@ -267,7 +330,7 @@ __Updated Examples:__
+ Modified `Makefile`s for the GNU-ARM projects to use `gcc` as the linker instead of `g++`
+ Modidfied `Makefile`s for the workstation examples to add the `-no-pie` linker option only when `GCC_OLD` environment variable is NOT defined. This is to accommodates older POSIX platforms with older GCC distribution.
+ Modified all ARM-KEIL uVision projects for ARM-CLANG to use the startup code in the ARM-ASM syntax.
- + New uC/OS-II example @ref ucos-ii_dpp_nucleo-l053r8 (Cortex-M0+)
+ + New uC/OS-II example @ref uc-os2_dpp_nucleo-l053r8 (Cortex-M0+)
+ Removed uC/OS-II example for the STM32-NUCLEO-L152RE (Cortex-M3)
+ Added QM model files: `workstation/defer/defer.qm` and `workstation/reminder2/reminder2.qm`
@@ -285,20 +348,18 @@ __Updated 3rd-Party Components:__
__Bug Fixes:__
- + [bug#267 "QP/C Spy build configuration fails on 64-bit target"](https://sourceforge.net/p/qpc/bugs/267/)
-
+ + [bug#267 "QP/C Spy build configuration fails on 64-bit target"](https://sourceforge.net/p/qpc/bugs/267)
@section qpc_6_8_1 Version 6.8.1, 2020-04-04
-
__Source code changes:__
Improved comments in the QF_stop() function. The comments now make it very clear that after calling QF_stop() the application must terminate and cannot continue. In particular, QF_stop() is **not** intended to be followed by a call to QF_init() to "resurrect" the application. The previous comments apparently were confusing and some developers attempted to "restart" a running application, which led to system crashes.
__Bug Fixes:__
-- [bug#261 QTime_disarm() clears the wrong flag](https://sourceforge.net/p/qpc/bugs/261/)
-- [bug#262 Ticker0 does not work in QPC 6.8.0](https://sourceforge.net/p/qpc/bugs/262/)
+- [bug#261 QTime_disarm() clears the wrong flag](https://sourceforge.net/p/qpc/bugs/261)
+- [bug#262 Ticker0 does not work in QPC 6.8.0](https://sourceforge.net/p/qpc/bugs/262)
Also, this release updates the QP/C ports and examples for workstations (Windows and POSIX) by consistently applying the "safe" versions of services from `` and ``. The "portable" versions of these services are defined as macros in the `safe_std.h` header file and include the following services:
@@ -317,7 +378,6 @@ These "safe" functions are mapped to the best approximation of these services av
@section qpc_6_8_0 Version 6.8.0, 2020-03-21
-
__Source code changes:__
- Fixed inconsistencies between QP API declarations in the `.h` files and definitions in the `.c` files, such as different parameter names in declarations and definitions (MISRA-C:2012).
@@ -347,15 +407,14 @@ Converted most of the examples for ARM-MDK from the no-longer maintained compile
The older ARM Compiler-5 is still supported, but will be phased out in the future. The only examples for ARM Compiler-5 are for the EK-TM4C123GXL (TivaC LanuchPad) board. These examples are located in the `arm` sub-directories.
-
@section qpc_6_7_0 Version 6.7.0, 2019-12-30
-The main purpose of this release is providing improved compliance with MISRA-C:2012 (including MISRA-C:2012-Amendment-1) and also to provide support for the [PC-Lint-Plus](https://www.gimpel.com/) static analysis tool (see also feature request [#169](https://sourceforge.net/p/qpc/feature-requests/169/)). Specifically, the QP/C source code and some examples have been adjusted to comply with MISRA-C:2012-Amendment-1 rules, with all deviations captured in the PC-Lint-Plus configuration files. These PC-Lint-Plus configuration files have been provided in the new "port" to PC-Lint-Plus in the directory qpc/ports/lint-plus/.
+The main purpose of this release is providing improved compliance with MISRA-C:2012 (including MISRA-C:2012-Amendment-1) and also to provide support for the [PC-Lint-Plus](https://www.gimpel.com) static analysis tool (see also feature request [#169](https://sourceforge.net/p/qpc/feature-requests/169)). Specifically, the QP/C source code and some examples have been adjusted to comply with MISRA-C:2012-Amendment-1 rules, with all deviations captured in the PC-Lint-Plus configuration files. These PC-Lint-Plus configuration files have been provided in the new "port" to PC-Lint-Plus in the directory qpc/ports/lint-plus/.
@note
The support for the older PC-Lint 9.x and the older MISRA-C:2004 has been dropped to avoid confusion and conflicts with the newer MISRA-C:2012 and the newer PC-Lint-Plus.
-This release also includes the offline documentation for **this** particular version of QP/C (in the `html/` folder). To view the offline documentation, open the file `html/index.html` in your web browser. (The online HTML documention for the **latest** version of QP/C remains located at: https://www.state-machine.com/qpc/ )
+This release also includes the offline documentation for **this** particular version of QP/C (in the `html/` folder). To view the offline documentation, open the file `html/index.html` in your web browser. (The online HTML documentation for the **latest** version of QP/C remains located at: https://www.state-machine.com/qpc/ )
The backwards-compatiblity layer for QP 4.x has been removed. Among others, the macros Q_ROM and Q_ROM_VAR are no longer defined.
@@ -363,9 +422,8 @@ Also, this release updates the Windows-GUI examples with the QWIN Prototyping To
__Bug Fixes:__
-- [bug#254 "Q_NEW_X_FROM_ISR for FreeRTOS port"](https://sourceforge.net/p/qpc/bugs/254/)
-- [bug#255 "IAR-ARM "Multi-file Compilation" fails for QK and QXK applications"](https://sourceforge.net/p/qpc/bugs/255/)
-
+- [bug#254 "Q_NEW_X_FROM_ISR for FreeRTOS port"](https://sourceforge.net/p/qpc/bugs/254)
+- [bug#255 "IAR-ARM "Multi-file Compilation" fails for QK and QXK applications"](https://sourceforge.net/p/qpc/bugs/255)
@section qpc_6_6_0 Version 6.6.0, 2019-10-31
@@ -386,20 +444,17 @@ This release brings also the following changes:
- removed Tcl test scripts from QUTest examples
-
@section qpc_6_5_1 Version 6.5.1, 2019-05-24
-
__Bug Fixes:__
-- [bug#241 "QUTest produces superfluous Trg-Done QS_RX_EVENT after publish"](https://sourceforge.net/p/qpc/bugs/241/).
-- [bug#242 "QUTest fails to process events posted/published from user commands"](https://sourceforge.net/p/qpc/bugs/242/).
+- [bug#241 "QUTest produces superfluous Trg-Done QS_RX_EVENT after publish"](https://sourceforge.net/p/qpc/bugs/241).
+- [bug#242 "QUTest fails to process events posted/published from user commands"](https://sourceforge.net/p/qpc/bugs/242).
Also, this release extends the `Makefiles` in the `qpc\examples\qutest` directory to provide the `debug` target. Specificall, the `qpc\examples\qutest\blinky` example has been extended with projects to `build/debug` this example with Visual C++ (on the host) and with ARM-KEIL on embedded target (EK-TM4C123).
Finally, this release adds ports and examples for PIC24/dsPIC 16-bit MCUs with MPLAB-X/XC16 and PIC32 with MPLAB-X/XC32 toolchains.
-
@section qpc_6_5_0 Version 6.5.0, 2019-03-30
This QP/C release matches the [QM release 4.5.0](https://www.state-machine.com/qm/history.html#qm_4_5_0), which introduced new implementation for QP/C++. Even though this has no impact on the QP/C state machine implementation with QM, this release is needed for compatibility checking between QP and QM.
@@ -420,8 +475,8 @@ This release brings the following changes:
@note
These additional assertions require #Q_DEFINE_THIS_FILE or #Q_DEFINE_THIS_MODULE at the top of the .c file that calls QHSM_INIT(), QACTIVE_START() or QXTHREAD_START().
-- modified examples for ThreadX to define BSP_TICKS_PER_SEC as TX_TIMER_TICKS_PER_SECOND instead of a hardcoded value
-- modified examples for uC/OS-II to define BSP_TICKS_PER_SEC as OS_TICKS_PER_SEC instead of a hardcoded value
+- modified examples for ThreadX to define BSP_TICKS_PER_SEC as TX_TIMER_TICKS_PER_SECOND instead of a hard-coded value
+- modified examples for uC/OS-II to define BSP_TICKS_PER_SEC as OS_TICKS_PER_SEC instead of a hard-coded value
- modified qassert.h to work correctly when assertions are disabled with #Q_NASSERT and also updated the QP/C source code to build correctly without assertions
- improved the QXK semaphores to handle correctly the maximum number of tokens
- reduced the size of QPSet in case #QF_MAX_ACTIVE does not exceed 8 or 16.
@@ -430,13 +485,11 @@ These additional assertions require #Q_DEFINE_THIS_FILE or #Q_DEFINE_THIS_MODULE
- fixed examples for MSP430 with CCS and added QUTest support for MSP430.
-
@section qpc_6_3_8 Version 6.3.8, 2018-12-31
-The main purpose of this release is the update the `Makefiles` that use the [GNU-ARM Embedded Toolchain](https://developer.arm.com/open-source/gnu-toolchain/gnu-rm) to match the recent update in [QTools for Windows 6.3.8](https://sourceforge.net/projects/qpc/files/QTools/). Specifically, all `Makefiles` in the `examples` directory have been updated to use the GNU-ARM toolchain located in `qtools\gnu_arm-none-eabi` and use the tools prefix **arm-none-eabi-**.
+The main purpose of this release is the update the `Makefiles` that use the [GNU-ARM Embedded Toolchain](https://developer.arm.com/open-source/gnu-toolchain/gnu-rm) to match the recent update in [QTools for Windows 6.3.8](https://sourceforge.net/projects/qpc/files/QTools). Specifically, all `Makefiles` in the `examples` directory have been updated to use the GNU-ARM toolchain located in `qtools\gnu_arm-none-eabi` and use the tools prefix **arm-none-eabi-**.
@note
-The `Makefiles` that use the GNU-ARM included in this release require [QTools for Windows version 6.3.8 or newer](https://sourceforge.net/projects/qpc/files/QTools/) and will **NOT** work with the older QTools collection.
-
+The `Makefiles` that use the GNU-ARM included in this release require [QTools for Windows version 6.3.8 or newer](https://sourceforge.net/projects/qpc/files/QTools) and will **NOT** work with the older QTools collection.
@section qpc_6_3_7 Version 6.3.7, 2018-11-20
@@ -452,7 +505,6 @@ Also, in this release, the prototypes of the internal functions `QActive_start_(
Finally, this release updates the internal implementation of QXK function `QXThread_post_()` for software tracing and testing with QUTest.
-
@section qpc_6_3_6 Version 6.3.6, 2018-10-20
This release brings important changes and improvements to the unit-testing support for [QUTest](https://www.state-machine.com/qtools/qutest.html). Specifically, a new "dummy" active object class ::QActiveDummy for testing has been added. Instances of this "dummy" AO can be now used as test-doubles for active objects that are recipients of events directly posted by the active object under test (AOUT). This, in turn, eliminates the need to alter the existing event-posting implementation, so that more of the actual QP code can be used in the QP test-stub (qutest.c).
@@ -460,7 +512,7 @@ This release brings important changes and improvements to the unit-testing suppo
The QUTest projects that build QP from sources need to include the qf_time.c file.
-As a consequence of the changes in the [QUTest](https://www.state-machine.com/qtools/qutest.html) support, the @ref exa_qutest "QUTest examples" have been re-designed and improved. Here, the most important changes include the new code organization, which reflects the customary separation of the code-under-test (CUT) from the code for testing. Also, the tests based on the ["TDD book" by James Grenning](https://www.amazon.com/Driven-Development-Embedded-Pragmatic-Programmers/dp/193435662X) have been replaced with fully functional tests based on the [Unity testing framework](http://www.throwtheswitch.org/unity/). This is to directly compare the traditional approach (Unity) with QUTest.
+As a consequence of the changes in the [QUTest](https://www.state-machine.com/qtools/qutest.html) support, the @ref exa_qutest "QUTest examples" have been re-designed and improved. Here, the most important changes include the new code organization, which reflects the customary separation of the code-under-test (CUT) from the code for testing. Also, the tests based on the ["TDD book" by James Grenning](https://www.amazon.com/Driven-Development-Embedded-Pragmatic-Programmers/dp/193435662X) have been replaced with fully functional tests based on the [Unity testing framework](http://www.throwtheswitch.org/unity). This is to directly compare the traditional approach (Unity) with QUTest.
The next change related to unit testing is adding ::QS_RX_QUERY_CURR facility to QS-RX (software tracing input channel) and the reply ::QS_QUERY_DATA to the QS output channel. These two extensions allow you to query the status of the "current object" inside the target. The most important example is querying the current state-machine object (::SM_OBJ), which returns the **current state**.
@@ -480,12 +532,10 @@ To facilitate the creation of truly portable, cross-platform examples, the exist
Finally, this release fixes a bug in the @ref posix-qv "POSIX-QV port", where the internal condition variable `QV_condVar_` has not been initialized.
-
@section qpc_6_3_4 Version 6.3.4, 2018-08-10
This release adds new API QTimeEvt_wasDisarmed() for checking the status of a ::QTimeEvt object after it has been disarmed. Specifically, the status of the last call to QTimeEvt_disarm() is kept inside the time event object and can be subsequently checked with the QTimeEvt_wasDisarmed() API. This new function is designed to be used directly as a guard condition on the timeout event, as described in the [PSiCC2 book](/psicc2), Section 7.7.3 "Arming and Disarming a Time Event" on page 359. The QTimeEvt_wasDisarmed() has a side effect of setting the "was disabled" status, so the guard evaluates to 'true' the next time it is checked.
-
@section qpc_6_3_3a Version 6.3.3a, 2018-07-16
This release adds Python test scripts to the QUTest examples (folder `qpc/examples/qutest`). Specifically, the makefiles have been augmented to accept symbol `SCRIPT=py`, in which case the Python test scripts (`*.py`) are used instead of the default Tcl test scripts (`*.tcl`).
@@ -493,24 +543,22 @@ This release adds Python test scripts to the QUTest examples (folder `qpc/exampl
This release does not change any QP/C APIs, QP/C implementation, ports, or other examples.
-
@section qpc_6_3_3 Version 6.3.3, 2018-06-22
This release fixes the following bugs:
-- [bug#216 "Generated code for QP version check violates MISRA-C Rule 10.1"](https://sourceforge.net/p/qpc/bugs/216/).
+- [bug#216 "Generated code for QP version check violates MISRA-C Rule 10.1"](https://sourceforge.net/p/qpc/bugs/216).
-- [bug#217 "GNU-ARM -fstack-protector incompatible with the QP ports to GNU-ARM"](https://sourceforge.net/p/qpc/bugs/217/).
+- [bug#217 "GNU-ARM -fstack-protector incompatible with the QP ports to GNU-ARM"](https://sourceforge.net/p/qpc/bugs/217).
Also, this release demonstrates the new features of QM 4.3.0 in several example models (qpc/examples/ directory).
Finally, this release updates `3rd_party/CMSIS/Include` to the latest version from GitHub.
-
@section qpc_6_3_2 Version 6.3.2, 2018-06-20
This release fixes the following bugs:
-- [bug#215 "QP is internally inconsistent in calling assertion macros"](https://sourceforge.net/p/qpc/bugs/215/).
+- [bug#215 "QP is internally inconsistent in calling assertion macros"](https://sourceforge.net/p/qpc/bugs/215).
Also, this release improves the QUTest DPP example (directory `qpc/examples/qutest/dpp`) by demonstrating the proper use of QS_TEST_PAUSE() and the corresponding test scripts. This example now matches the [QUTest documentation of this feature](https://www.state-machine.com/qtools/qutest_rtc.html#qutest_pause).
@@ -518,16 +566,14 @@ Also, this release improves the QUTest DPP example (directory `qpc/examples/qute
Finally, this release modifies the QP/C ports to POSIX and POSIX-QV by allowing to configure the p-thread priority of the ticker thread. This is achieved by adding a `tickPrio` parameter to the `QF_setTickRate()` function. (**NOTE** this modification will require changing existing QP applications for POSIX or POSIX-QV that call `QF_setTickRate()`.
-
@section qpc_6_3_1 Version 6.3.1, 2018-05-24
This release migrates the [QUTest](https://www.state-machine.com/qtools/qutest.html) examples to [QM 4.2.1](https://www.state-machine.com/qm/history.html#qm_4_2_1), which now can generate QS_FUN_DICTIONARY() records automatically. This release also adds a generic, simple blinky example for QUTest located in `examples/qutest/blinky`. Also, this release fixes a bug in the example `qutest/TDDbook_LedDriver` so that the code compiles cleanly with the updated header file "qassert.h".
-
@section qpc_6_3_0 Version 6.3.0, 2018-05-10
The main purpose of this release is fixing the sub-machine support in the QP/Spy build configuration. Specifically, this release fixes the following bug:
-- [bug#213 "QP/C/C++ applications with submachines occasionally crash in Spy build configuration"](https://sourceforge.net/p/qpc/bugs/213/)
+- [bug#213 "QP/C/C++ applications with submachines occasionally crash in Spy build configuration"](https://sourceforge.net/p/qpc/bugs/213)
@attention
This release matches [QM 4.2.0](https://www.state-machine.com/qm/history.html#qm_4_2_0).
@@ -535,7 +581,6 @@ This release matches [QM 4.2.0](https://www.state-machine.com/qm/history.html#qm
Additionally, the release contains some re-factoring of the QS-RX input channel.
-
@section qpc_6_2_0 Version 6.2.0, 2018-03-16
The main purpose of this release is extednding the functionality of the [QUTest unit testing](https://www.state-machine.com/qtools/qutest.html) for QP/C applications. Specifically, this release adds support for testing of **self-posting** of events in active objects, which is an essential element in the [Reminder](https://www.state-machine.com/doc/Pattern_Reminder.pdf) and [Deferred Event](https://www.state-machine.com/doc/Pattern_DeferredEvent.pdf) design patterns. To implement this new feature, the QS-RX (QS receive channel) has been extened by a small scheduler that processes all secondary events gnenerated by dispatching, posting, or publishing events (only active when the #Q_UTEST macro is defined). Also, the implementation of the target resident QUTest components (files `src/qs/qutest.c` and `src/qf/qf_actq.c`) have been modified to allow posting of events during unit testing.
@@ -556,9 +601,8 @@ Additionally, this release updates the QP/C ports to win32-qv and posix-qv to al
Finally, this release phases out the `qp_port.h` header file. If any of your projects still includes this file, please replace it with the qpc.h heder file.
-
@section qpc_6_1_1 Version 6.1.1, 2018-02-18
-The main purpose of this release is adding the context-switch callbacks to the preemptive @ref qk "QK" and @ref qxk "QXK" kernels. The QK_onContextSw() and QXK_onContextSw() callback functions provide a mechanism to perform additional custom operations when QK/QXK switches context from one thread to another. To avoid extra overhead when this functionality is not needed and for backwards-compatiblity with the existing applications, the callbacks are enabled only when the macros #QK_ON_CONTEXT_SW (for QK) and #QXK_ON_CONTEXT_SW (for QXK) are defined. These macros can be defined either directly in command-line for the compiler, or in the QK/QXK port files (qk_port.c for QK and qxk_port.c for QXK). Examples for the context-switch callbacks have been provided for for the @ref arm-cm_dpp_nucleo-l053r8 "NUCLEO-L053R8" (Cortex-M0+) and the @ref arm-cm_dpp_nucleo-h743zi "NUCLEO-H743ZI" (Cortex-M7).
+The main purpose of this release is adding the context-switch callbacks to the preemptive @ref srs_qk "QK" and @ref srs_qxk "QXK" kernels. The QK_onContextSw() and QXK_onContextSw() callback functions provide a mechanism to perform additional custom operations when QK/QXK switches context from one thread to another. To avoid extra overhead when this functionality is not needed and for backwards-compatiblity with the existing applications, the callbacks are enabled only when the macros #QK_ON_CONTEXT_SW (for QK) and #QXK_ON_CONTEXT_SW (for QXK) are defined. These macros can be defined either directly in command-line for the compiler, or in the QK/QXK port files (qk_port.c for QK and qxk_port.c for QXK). Examples for the context-switch callbacks have been provided for for the @ref arm-cm_dpp_nucleo-l053r8 "NUCLEO-L053R8" (Cortex-M0+) and the @ref arm-cm_dpp_nucleo-h743zi "NUCLEO-H743ZI" (Cortex-M7).
Also, this release changes the ARM Cortex-M ports for the IAR-ARM toolchain in that it replaces the assembly modules with the equivalent C implementation. This change enables using the configuration macros #QK_ON_CONTEXT_SW (for QK) and #QXK_ON_CONTEXT_SW (for QXK) in the ports. All existing example projects for IAR-ARM have been updated to use the `q(x)k_port.c` files instead of `q(x)k_port.s` files.
@@ -567,9 +611,8 @@ Also, this release adds new project files for the Atollic TRUEstudio for STM32.
Finally, this relese updates the CMSIS to version 5.3.0 (see `qpc/3rd_party/CMSIS`)
-
@section qpc_6_1_0 Version 6.1.0, 2018-02-04
-The main purpose of this release is adding the support for the [ARM Compiler 6 (ARM-Clang)](https://developer.arm.com/products/software-development-tools/compilers/arm-compiler), which is a C/C++ toolchain for ARM processors based on the modern [Clang frontend](https://clang.llvm.org/) and the [LLVM framework](https://llvm.org/). This release adds the ARM-Clang ports and examples for all built-in kernels (QV, QK, and QXK) for the ARM Cortex-M CPU cores.
+The main purpose of this release is adding the support for the [ARM Compiler 6 (ARM-Clang)](https://developer.arm.com/products/software-development-tools/compilers/arm-compiler), which is a C/C++ toolchain for ARM processors based on the modern [Clang frontend](https://clang.llvm.org) and the [LLVM framework](https://llvm.org). This release adds the ARM-Clang ports and examples for all built-in kernels (QV, QK, and QXK) for the ARM Cortex-M CPU cores.
This release also adds support for the STM32H7 high-performance Cortex-M7 with the **double-precision FPU** (FPv5-DP-D16-M). Specifically, this release provides examples for the [NUCLEO-H743ZI board](http://www.st.com/en/evaluation-tools/nucleo-h743zi.html) (Cortex-M7 with FPv5-DP-D16-M). The @ref arm-cm_dpp_nucleo-h743zi "examples for NUCLEO-H743ZI board" include all built-in kernels with ARM-CLANG, ARM-KEIL, GNU-ARM, and IAR-ARM. Additionally the NUCLEO-H743ZI examples also include the QP FreeRTOS with ARM-KEIL, GNU-ARM, and IAR-ARM.
@@ -580,9 +623,8 @@ Also, this release updates the existing projects for the Code Composer Studio (C
Also, all examples for MSP430 with CCS have been updated to CCSv7 and re-tested on the supported boards.
-
@section qpc_6_0_4 Version 6.0.4, 2018-01-10
-The main purpose of this release is the provision of the official @ref freertos "QP/C port to FreeRTOS" (version 10). The QP/C port to FreeRTOS is completely generic and should work on any CPU supported by FreeRTOS. The port comes with the following examples (see examples/freertos/):
+The main purpose of this release is the provision of the official @ref freertos "QP/C port to FreeRTOS" (version 10). The QP/C port to FreeRTOS is completely generic and should work on any CPU supported by FreeRTOS. The port comes with the following examples (see examples/freertos):
- @ref freertos_dpp_ek-tm4c123gxl "DPP on EK-TM4C123GXL (ARM Cortex-M4F)" with ARM-KEIL, GNU-ARM and IAR-ARM toolchains.
- @ref freertos_dpp_stm32f746g-disco "DPP on STM32F746G-Discovery (ARM Cortex-M7)" with ARM-KEIL, GNU-ARM and IAR-ARM toolchains.
@@ -590,19 +632,17 @@ This release also replaces assembly with C implementation in the ARM-KEIL ports
Additionally, this release fixes some problems with the native examples for STM32F4 and STM32F7 boards.
-Additionally, this release adds a generic function QActive_setAttr() to set thread attributes in various QP ports to 3rd-party RTOSes. This function is then used in the @ref embos "embOS port" and the @ref ucos-ii "uC/OS-II port".
+Additionally, this release adds a generic function QActive_setAttr() to set thread attributes in various QP ports to 3rd-party RTOSes. This function is then used in the @ref embos "embOS port" and the @ref uc-os2 "uC/OS-II port".
Finally, this release fixes the following bug in the @ref threadx "ThreadX port":
-- [bug#197 "Problems with scheduler locking in QP/C/C++ ports to ThreadX"](https://sourceforge.net/p/qpc/bugs/197/)
-
+- [bug#197 "Problems with scheduler locking in QP/C/C++ ports to ThreadX"](https://sourceforge.net/p/qpc/bugs/197)
@section qpc_6_0_3 Version 6.0.3, 2017-12-12
-
Changes since version 6.0.1:
-- fixed [bug#193 "QXK: context switch from extended to basic thread fails"](https://sourceforge.net/p/qpc/bugs/193/)
+- fixed [bug#193 "QXK: context switch from extended to basic thread fails"](https://sourceforge.net/p/qpc/bugs/193)
- replaced attributes of ::QActive and ::QEQueue classes from type `uint_fastX_t` to `uintX_t`. For the ARM Cortex-M port, these changes reduce the memory footprint of each ::QActive instance from 50 to 38 bytes (25% improvement).
@@ -620,16 +660,15 @@ Changes since version 6.0.1:
This release does not change any of the QP/C APIs.
-
@section qpc_6_0_1 Version 6.0.1, 2017-11-10
The main focus of this release is to fix the remaining problems with transitions out of eXit-Points in sub-machines. Specifically, this release modifies the QMsm-based state machine implementation strategy (file src/qf/qep_msm.c to properly handle transitions from eXit-Points to Entry-Points and from eXit-Points to History connectors in sub-machines. These changes are part of fixing the following bugs reported for QM:
-- [bug#190 "Exit-Point segment targeting History doesn't work"](https://sourceforge.net/p/qpc/bugs/190/)
+- [bug#190 "Exit-Point segment targeting History doesn't work"](https://sourceforge.net/p/qpc/bugs/190)
-- [bug#189 "Exit-Point segment targeting an Entry-Point to sub-machine state doesn't work"](https://sourceforge.net/p/qpc/bugs/189/)
+- [bug#189 "Exit-Point segment targeting an Entry-Point to sub-machine state doesn't work"](https://sourceforge.net/p/qpc/bugs/189)
Additionally, this release fixes the following bug in transitions to "shallow history":
-- [bug#191 "Transition to shallow history in QMsm causes assertion qep_msm#810"](https://sourceforge.net/p/qpc/bugs/191/)
+- [bug#191 "Transition to shallow history in QMsm causes assertion qep_msm#810"](https://sourceforge.net/p/qpc/bugs/191)
The bug#191 is fixed by modifying the function QMsm_childStateObj_() in qep_msm.c to return the parent state in the corner case when the current state is the parent state.
@@ -638,27 +677,25 @@ The bug#191 is fixed by modifying the function QMsm_childStateObj_() in qep_msm.
This QP/C 6.0.1 release is the minium version required in QM 4.1.0. This is because QM 4.1.0 assumes the modified QMsm-state machine implementation strategy in order to properly handle the various transitions out of eXit-Points in sub-machine states.
-Additionally, this release changes the QXK implementation related to the [bug#186 "QXK: Extended thread context switch causes assertion in PendSV_Handler"](https://sourceforge.net/p/qpc/bugs/186/). Specifically, the case of context switching away and back to the same thread (which can arise under specific interrupt preemption scenarios) is now handled as a simple return from PendSV. The QXK scheduler has been modified to set the "next" thread pointer to NULL when it detects switching back to the "current" thread.
-
+Additionally, this release changes the QXK implementation related to the [bug#186 "QXK: Extended thread context switch causes assertion in PendSV_Handler"](https://sourceforge.net/p/qpc/bugs/186). Specifically, the case of context switching away and back to the same thread (which can arise under specific interrupt preemption scenarios) is now handled as a simple return from PendSV. The QXK scheduler has been modified to set the "next" thread pointer to NULL when it detects switching back to the "current" thread.
@section qpc_6_0_0 Version 6.0.0, 2017-10-13
This release fixes two bugs found in the QXK kernel:
-- [bug#185](https://sourceforge.net/p/qpc/bugs/185/) "QXK: PendSV_Handler uses inconsistent stack frames for saving and restoring AO for Cortex-M0(+)"
-- [bug#186](https://sourceforge.net/p/qpc/bugs/186/) "QXK: Extended thread context switch causes assertion in PendSV_Handler"
+- [bug#185](https://sourceforge.net/p/qpc/bugs/185) "QXK: PendSV_Handler uses inconsistent stack frames for saving and restoring AO for Cortex-M0(+)"
+- [bug#186](https://sourceforge.net/p/qpc/bugs/186) "QXK: Extended thread context switch causes assertion in PendSV_Handler"
Additionally, this release includes a fix for the bug found in ARM Cortex-M0 port with the GNU-ARM compiler:
-- [bug#189](https://sourceforge.net/p/qpc/bugs/184/) "QS_END() leaves all interrupts disabled w/ GNU ARM"
+- [bug#189](https://sourceforge.net/p/qpc/bugs/184) "QS_END() leaves all interrupts disabled w/ GNU ARM"
-This specific problem observed in QSpy turned out to be caused by a bug in the GNU-ARM compiler itself. This problem affected the ARMv6-M architecture (Cortex-M0/M0+/M1) and manifested itself in generation of incorrect code for the QP critical section at certain gcc optimization levels (such as -O). This bug was first discovered and filed as [bug#184](https://sourceforge.net/p/qpc/bugs/184/). The bug affected the GNU-ARM ports to all built-in kernels @ref qv "QV", @ref qk "QK", and @ref qxk "QXK".
+This specific problem observed in QSpy turned out to be caused by a bug in the GNU-ARM compiler itself. This problem affected the ARMv6-M architecture (Cortex-M0/M0+/M1) and manifested itself in generation of incorrect code for the QP critical section at certain gcc optimization levels (such as -O). This bug was first discovered and filed as [bug#184](https://sourceforge.net/p/qpc/bugs/184). The bug affected the GNU-ARM ports to all built-in kernels @ref srs_qv "QV", @ref srs_qk "QK", and @ref srs_qxk "QXK".
@attention
This release no longer contains the directory `qpc/source`, which was scheduled to be phased out in QP5. In QP6 the source code is found only in the `qpc/src` directory.
-
@section qpc_5_9_9 Version 5.9.9, 2017-09-29
-This release implements the feature request [#132 "Extend the QXK mutex to support also simple operation without the priority-ceiling protocol"](https://sourceforge.net/p/qpc/feature-requests/132/).
+This release implements the feature request [#132 "Extend the QXK mutex to support also simple operation without the priority-ceiling protocol"](https://sourceforge.net/p/qpc/feature-requests/132).
@note
This release is completely backwards-compatible with the @ref qpc_5_9_8 "previous QP/C release 5.9.8".
@@ -671,9 +708,8 @@ Specifically, the ::QXMutex class has been extended as follows:
- when initialized with `ceiling>0`, ::QXMutex WILL use the priority-ceiling protocol, as before. It will require that the ceiling priority be unique and not used by any other thread or mutex. In other words, the previous functionality remains unchanged.
-
@section qpc_5_9_8 Version 5.9.8, 2017-09-15
-This release fixes the QXK kernel [bug#182 " Inconsistent QXThread_post_() behavior with respect to the 'margin' parameter"](https://sourceforge.net/p/qpc/bugs/182/).
+This release fixes the QXK kernel [bug#182 " Inconsistent QXThread_post_() behavior with respect to the 'margin' parameter"](https://sourceforge.net/p/qpc/bugs/182).
Also, the pre-condition assertion in the function QF_newRef_() (file `src/qf/qf_dyn.c`) has been modified to allow creating event references only for dynamic events `(e->poolId_ == 0)`.
@@ -694,9 +730,8 @@ Modifed ARM Cortex-M examples with the GNU-ARM toolset to be consistent with QP/
@endverbatim
-
@section qpc_5_9_7 Version 5.9.7, 2017-08-18
-The main focus of this release are new requested features for the @ref qxk "dual-mode QXK kernel":
+The main focus of this release are new requested features for the @ref srs_qxk "dual-mode QXK kernel":
- feature#129 "Allow blocking while holding a mutex in QXK"; and
- feature#130 "Allow QXK mutex locks to nest while acquired by the same thread"; and
- feature#131 "Add a non-blocking "tryLock()" operation to the QXK mutex".
@@ -705,7 +740,7 @@ Additionally, this release adds also the non-blocking QXSemaphore_tryWait() oper
In the process of re-implementing the ::QXMutex class, the previouis non-blocking priority ceiling mutex has been replaced with an equivalent selective QXK scheduler locking up to the specified ceiling priority. Specifically, this feature has been implemented with two new operations QXK_schedLock() and QXK_schedUnlock().
-For consistency, the non-blocking mutex of the @ref qk "QK kernel" has been also replaced by the operations QK_schedLock() and QK_schedUnlock().
+For consistency, the non-blocking mutex of the @ref srs_qk "QK kernel" has been also replaced by the operations QK_schedLock() and QK_schedUnlock().
All related QXK and QK examples have been updated to use the selective scheduler locking instead of the mutex. The new blocking QXK mutex has been demonstrated in the following updated examples:
- @ref arm-cm_dpp_efm32-slstk3401a
@@ -725,7 +760,6 @@ Finally, this release fixes the following bug:
- bug#181 "Win32-qv port and QF_run "idle" time"
-
@section qpc_5_9_6 Version 5.9.6, 2017-08-04
The main focus of this release are improvements to the "dual-mode" QXK kernel. Specifically, this release implements the featrue request #128 "QP Semaphore Max Value Setting" for QXK. This feature changes the QXK function QXSemaphore_init(), which now takes additional parameter `count`. This parameter specifies the maximum allowed count for the semaphore (e.g., count of 1 makes the semaphore a binary-semaphore).
@@ -741,7 +775,6 @@ Also, this release adds protection in the IRQ priorities initialization in QK/QV
Finally, this release consistently changes all example projects (for all toolchains) to use the **src/** directory for QP/C source code, instead of the **source/** directory. The source/ directory is now truly obsolete, but is still provided in this release for backwards compatibility with user projects.
-
@section qpc_5_9_5 Version 5.9.5, 2017-07-20
This release changes the macro QXTHREAD_START() in the QXK kernel so that
it can be used only with ::QXThread pointers and not ::QActive pointers.
@@ -763,11 +796,9 @@ to `startup_stm32f746xx.c/s`. The change has been also made in the example
projects for the STM32F7-Discovery board (for ARM-KEIL and GNU-ARM toolsets).
-
@section qpc_5_9_4 Version 5.9.4, 2017-07-07
This release adds Thread-Local Storage (TLS) feature for the dual-mode
-QXK kernel (see @ref qxk_tls).
-
+QXK kernel (see @ref srs_qxk_tls).
@section qpc_5_9_3 Version 5.9.3, 2017-06-19
@@ -778,7 +809,6 @@ Q_NEW_X() or QACTIVE_POST_X() with the margin argument of zero will no
longer assert if the allocation/posting fails.
-
@section qpc_5_9_2 Version 5.9.2, 2017-06-05
This release adapts the Makefiles for GNU-ARM to the new location of the
GNU-ARM toolset, which is now included in the QTools Collection (v 5.9.1)
@@ -806,7 +836,6 @@ QXK kernels and ARM-Keil, GNU-ARM, and IAR-ARM toolsets. The demos support
bi-directional QP/Spy.
-
@section qpc_5_9_1 Version 5.9.1, 2017-05-26
This release fixes the following bug:
- bug#169 "Submachine-state eXit Point does not work correctly"
@@ -842,7 +871,6 @@ phased out in the future QP/C releases. Please use the new source code
structure provided in the `qpc/src` directory.
-
@section qpc_5_9_0 Version 5.9.0, 2017-05-19
The main purpose of this milestone QP/C release is to provide support for the powerful **Unit Testing Framework** called
QUTest™ (pronounced *cutest*).
@@ -894,7 +922,6 @@ Finally, this release fixes the following bugs:
- bug#162 "QF critical sections require modification for M7 core"
-
@section qpc_5_8_2 Version 5.8.2, 2017-02-08
This release adds examples for the ARM Cortex-M7 CPU. Specifically,
the release contains the standard @ref dpp "Dining Philosophers Problem (DPP)"
@@ -915,7 +942,6 @@ Finally, this release fixes the following bugs:
compilation
-
@section qpc_5_8_1 Version 5.8.1, 2016-12-16
This release is in response to a recent finding that many QP users of the
ports to ARM Cortex-M3/M4 forget to explicitly set their interrupt priorities,
@@ -953,7 +979,6 @@ Changes in detail:
standard distribution.
-
@section qpc_5_8_0 Version 5.8.0, 2016-11-30
The main purpose of this milestone QP/C release is to finally provide
the baseline framework fully compatible with the upcoming QM 4.0.0.
@@ -1000,7 +1025,6 @@ Finally, the complete list of bugs fixed in this release is as follows:
- bug#124 "Windows port now cause memory leakage"
-
@section qpc_5_7_4 Version 5.7.4, 2016-11-04
This release fixes the following bugs:
- bug#145 QF_PUBLISH() leaks events that have no subscribers
@@ -1008,7 +1032,6 @@ This release fixes the following bugs:
- bug#143 QACTIVE_POST_LIFO() on initial transition asserts on QXK
-
@section qpc_5_7_3 Version 5.7.3, 2016-10-07
This release adds QP ports to the TI-RTOS kernel (SYS/BIOS) with TI-CCS
and IAR EWARM toolsets. Examples are provided for the EK-TM4C123GXL
@@ -1025,7 +1048,6 @@ Also, this release fixes the following bugs:
returning to task).
-
@section qpc_5_7_2 Version 5.7.2, 2016-09-30
This is the first production release of the "dual-mode" QXK kernel.
"Dual-mode" QXK means that QXK supports both basic-threads (BC1 class
@@ -1058,7 +1080,6 @@ Finally, this release improves the implementation of scheduler locking
in publish-subscribe event delivery.
-
@section qpc_5_7_0 Version 5.7.0, 2016-08-31
This release adds support for sub-machines and sub-machine states for reusing pieces of state machines (an advanced UML concept) to the QMsm-state machine implementation strategy. This feature is to match the upcoming QM 4.0.0.
@@ -1079,7 +1100,6 @@ Changes in detail:
5. Modified the ARM Cortex-M QXK ports (ARM-KEIL, GNU, IAR, and TI)
-
@section qpc_5_6_5 Version 5.6.5, 2016-06-06
This release adds support for the new board: EFM32-SLSTK3401A (Pearl Gecko Starter Kit from Silicon Labs). This board replaces the Stellaris EK-LM3S811 board, which has been discontinued. (The Stellaris EK-LM3S811 board had been used in the "Fly 'n' Shoot" game example accompanying the PSiCC2 book).
@@ -1096,17 +1116,14 @@ This release fixes the following bugs:
- bug#131 (QF_newRef_ increments reference counter without QF_CRIT_ENTRY_()).
-
@section qpc_5_6_4 Version 5.6.4, 2016-04-25
This release fixes a serious Bug #128 (https://sourceforge.net/p/qpc/bugs/128 ) in the QK port to ARM Cortex-M introduced back in QP 5.6.1
-
@section qpc_5_6_3 Version 5.6.3, 2016-04-12
This release fixes a serious Bug #126 (https://sourceforge.net/p/qpc/bugs/126 ) in the QK preemptive scheduler introduced in QP 5.6.2.
-
@section qpc_5_6_2 Version 5.6.2, 2016-03-31
The main purpose of this release is to introduce _atomic event multicasting_, meaning that event publishing to all subscribers is now protected from preemption. This eliminates potential for re-ordering of events under preemptive kernels (such as QK, QXK, or 3rd-party RTOSes), when events are published from low-priority AOs and some higher-priority subscribers can preempt multicasting and post/publish events of their own (before the original event is posted to all subscribers).
@@ -1153,9 +1170,8 @@ Changes in detail:
16. Implemented Feature Request #110 as well as the duplicate Request #62 by adding function QActive_flushDeferred()
-
@section qpc_5_6_1 Version 5.6.1, 2016-01-01
-This release is the first official (production) release of the new blocking @ref qxk "QXK" kernel.
+This release is the first official (production) release of the new blocking @ref srs_qxk "QXK" kernel.
Changes in detail:
@@ -1164,15 +1180,13 @@ Changes in detail:
2. Corrected example projects for the ARM Cortex-M with TI/CCS toolset
-
@section qpc_5_6_0 Version 5.6.0-beta, 2015-12-24
-
-The main purpose of this *beta* release is to introduce a new component of the QP/C framework called @ref qxk "QXK" ("eXtended Quantum Kernel"). QXK is a small, preemptive, priority-based, **blocking** kernel that provides most features you might expect of a traditional blocking RTOS kernel.
+The main purpose of this *beta* release is to introduce a new component of the QP/C framework called @ref srs_qxk "QXK" ("eXtended Quantum Kernel"). QXK is a small, preemptive, priority-based, **blocking** kernel that provides most features you might expect of a traditional blocking RTOS kernel.
QXK has been designed specifically for applications that need to mix event-driven active objects with traditional blocking code, such as commercial middleware (TCP/IP stacks, UDP stacks, embedded file systems, etc.) or legacy software. The QXK kernel is integrated tightly and optimally with the rest of the QP. It reuses all mechanisms already provided in QP, thus avoiding any code duplication, inefficient layers of indirection, and additional licensing costs, which are inevitable when using 3rd-party RTOS kernels to run QP/C applications.
@note
-The QXK documentation is available in the QP/C Reference Manual at @ref qxk
+The QXK documentation is available in the QP/C Reference Manual at @ref srs_qxk
Additionally, this release removes the macros Q_ROM, Q_ROM_BYTE, and Q_ROM_VAR from the QP/C code. These macros have been necessary for odd Harvard-architecture 8-bit CPUs (such as AVR, 8051) to place constant data in ROM. As QP/C stopped supporting those CPUs, the non-standard extensions could be removed from the QP/C code base.
@@ -1208,7 +1222,6 @@ Changes in detail:
12. Updated CMSIS from 4.2 to 4.3 in qpc/3rd-party/CMSIS
-
@section qpc_5_5_1 Version 5.5.1, 2015-10-05
The main focus of this release is to improve the AAPCS compliance of the
ARM Cortex-M port to the QK preemptive kernel. Specifically, the PendSV
@@ -1230,9 +1243,7 @@ the file `qpc/examples/arm-cm/dpp_ek-tm4c123gxl/qv/bsp.c` did not
re-enable interrupts in the QV_onIdle() callback.
-
@section qpc_5_5_0 Version 5.5.0, 2015-09-04
-
The main purpose of this release is the extension of the QS software tracing system to bi-directional communication with embedded Targets. Specifically, the QS-RX (receive channel for QS) has been added with the following capabilities:
1. Set global QS filters inside the Target
@@ -1278,7 +1289,7 @@ support the shallow-history mechanism.
every build has an up-to-date and unique time stamp.
5. Extended the DPP on TivaC LauchPad example (directory
-qpc/examples/arm-cm/dpp_ek-tm4c123gxl/) to demonstrate QS-RX (QS receive
+`qpc/examples/arm-cm/dpp_ek-tm4c123gxl/`) to demonstrate QS-RX (QS receive
channel).
6. Provided example of customizing the "QspyView" Tcl/Tk script for the
@@ -1296,9 +1307,7 @@ Q_onAssert() for each specific project.
(SYSCTL->RCGCGPIO rather than the deprecated SYSCTL->RCGC2).
-
@section qpc_5_4_2 Version 5.4.2, 2015-06-04
-
The main focus of this release is to improve the support for "dual targeting" of QP/C applications, which is developing of deeply embedded code as much as possible on the desktop OS, such as Windows. Experience shows that "dual targeting" dramatically improves productivity of embedded systems developers, perhaps more than any other technique.
This release makes it possible to use exactly the **same** application code, main function, and the Board Support Package interface (bsp.h) on both deeply embedded target and on Windows. The only differences between these targets can be completely encapsulated in the Board Support Package implementation (bsp.c).
@@ -1326,9 +1335,7 @@ Changes in detail:
9. Improved the PC-Lint support for checking the application-level code located in in `examples/arm-cm/dpp_ek-tm4c123gxl/lint`
-
@section qpc_5_4_1 Version 5.4.1, 2015-05-14
-
This release changes the active object class hierarchy so that ::QMActive is now more fundamental and is the base class for ::QActive. (Previously ::QMActive was a subclass of ::QActive). The newly added documentation section about @ref classes "QP/C Design" shows the current class hierarchy.
@note
@@ -1351,9 +1358,7 @@ Also, this release brings several cosmetic improvements:
7. Several README files have been updated.
-
@section qpc_5_4_0 Version 5.4.0, 2015-04-26
-
This release changes the basic philosophy of distributing the QP frameworks by **combining** the "QP/C Baseline Code" with all currently available "QP/C Development Kits" (QDK/C). This is done to eliminate any potential mistakes in downloading and installing separate pieces of code.
Additionally, this release changes the basic philosophy of building your embedded applications with the QP/C framework. Starting with this release, all @ref exa "examples" for embedded boards include the QP/C framework as **source code** within the projects, instead of statically linking with a QP/C library. (**NOTE:** It is still possible to use QP/C as a library, but you need to build such libraries yourself, as they are no longer provided in the QP/C distribution.)
@@ -1384,7 +1389,7 @@ Changes in detail:
2. Removed class QFsm (which is now deprecated). Legacy state machines coded in the "QFsm-style" will continue to work, but will use the ::QHsm implementation internally. There is no longer any efficiency advantage in using the "QFsm-style" state machines.
-3. Applied a slight performance improvement to the ARM Cortex-M port to the QK preemptive kernel. The QK port now checks for ISR context by looking at the IPSR register, instead of incrementing and decrementing the `QK_intNest_` up-down counter.
+3. Applied a slight performance improvement to the ARM Cortex-M port to the QK preemptive kernel. The QK port now checks for ISR context by looking at the IPSR register, instead of incrementing and decrementing the `QF_intNest_` up-down counter.
4. Updated @ref exa_arm-cm "ARM Cortex-M examples" and provided new examples for NXP mbed-LPC1768, and STM32 NUCLEO-L053R8, and NUCLEO-L152RE boards. All examples now use the latest CMSIS (V4.3.0). All ARM Cortex-M exampels are provided for the ARM-KEIL, GNU-ARM, and IAR-ARM toolsets.
@@ -1402,7 +1407,7 @@ Changes in detail:
11. Added @ref threadx "port to Thread-X". Example is available for the Thread-X demo with Visual Studio on Windows.
-12. Updated port to @ref ucos-ii "uC/OS-II" for the latest version v2.92. Examples are available for TI EK-TM4C123GLX and STM32 NUCLEO-L152RE boards with ARM-KEIL and IAR-ARM toolsets.
+12. Updated port to @ref uc-os2 "uC/OS-II" for the latest version v2.92. Examples are available for TI EK-TM4C123GLX and STM32 NUCLEO-L152RE boards with ARM-KEIL and IAR-ARM toolsets.
13. Updated @win32 "port to Win32" (Windows). Modified the port to apply a generous "fudge factor" in over-sizing QP event queues and event pools, to minimize the risk of overflowing queues/pools due to non-deterministic Windows behavior.
@@ -1411,9 +1416,7 @@ Changes in detail:
15. Updated the @ref lwip_ek-lm3s6965 "lwIP-QP example for EK-LM3S6965 board".
-
@section qpc_5_3_1 Version 5.3.1, 2014-09-19
-
@note QP/C 5.3.1 remains backwards-compatible with all QP/C ports and
applications
@@ -1433,9 +1436,7 @@ Additionally, this release improves the uC/OS-II port in that it is now generic
Finally, this release improves the "QP/C Reference Manual" generated by Doxygen and available both inside the QP/C baseline distribution (qpc.chm file) and online at: https://www.state-machine.com/qpc
-
@section qpc_5_3_0 Version 5.3.0, 2014-03-31
-
This release adds the "transition to history" (deep history) feature to
both QHsm and QMsm state machines and their subclasses. This QP/C
release matches the new QM modeling tool version 3.1.0, which now
@@ -1534,9 +1535,7 @@ its subclasses like QMActive) "is in" the given state.
in the QP/C library builds.
-
@section qpc_5_2_1 Version 5.2.1, 2014-01-06
-
This release fixes two bugs.
1. In file qmsm_dis.c added saving of the action-table into a temporary
@@ -1551,9 +1550,7 @@ configurations: Debug, Release, and Spy.
trace buffer.
-
@section qpc_5_2_0 Version 5.2.0, 2013-12-26
-
This release matches the new QM 3.0.0, for which it provides model
examples based on the new QMsm/QMActive classes. This, in turn
demonstrates the new state machine code generation that QM3 was
@@ -1644,9 +1641,7 @@ in the Embedded.com article "Are We Shooting Ourselves in the Foot with
Stack Overflow?".
-
@section qpc_5_1_1 Version 5.1.1, 2013-10-10
-
This release fixes reversal of logic in the QF_noTimeEvtsActiveX()
function as well as sleep mode transition in the ARM Cortex-M3/M4 ports
to the cooperative Vanilla kernel. Also, the native QP event queue
@@ -1680,9 +1675,7 @@ qpc/examples/arm-cm/qk/iar/dpp-qk_ek-lm3s811-lint). Updated lint files
for the latest PC-Lint
-
@section qpc_5_1_0 Version 5.1.0, 2013-09-23
-
This release brings significant improvements to the QS software tracing
implementation and also brings important changes the ARM Cortex-M port.
@@ -1781,9 +1774,7 @@ ARM Cortex-M Interrupt Priorities in QP 5.1" available at:
https://www.state-machine.com/doc/AN_ARM-Cortex-M_Interrupt-Priorities.pdf
-
@section qpc_5_0_0 Version 5.0.0, 2013-09-10
-
@note QP/C 5.0.0 remains backwards-compatible with the existing QP/C 4.x
applications.
@@ -1952,9 +1943,7 @@ Cortex-M (with the GNU, IAR, and Keil toolsets).
- added search box and tree-view panel to the HTML documentation
-
@section qpc_4_5_04 Version 4.5.04, Feb 08, 2013
-
The main purpose of this release is adding support for the ARM Cortex-M4F
processors with the hardware Floating-Point Unit (FPU). The QP/C ports
to Cortex-M4F take full advantage of the "lazy stacking" feature of the
@@ -1992,9 +1981,7 @@ several typos.
moved them to the separate QDK/C-Qt.
-
@section qpc_4_5_03 Version 4.5.03, Nov 27, 2012
-
This release changes the directory structure of QP ports to various
operating systems, such as POSIX (Linux, BSD, etc.), Win32 (Windows),
Qt, etc. The OS ports are moved from the ports/80x86/ directory one
@@ -2002,9 +1989,7 @@ level up to ports/. Also, the OS examples are moved from the
examples/80x86/ directory one level up to examples/.
-
@section qpc_4_5_02 Version 4.5.02, Aug 04, 2012
-
The main purpose of this release is better, more comprehensive
support for (rapid) prototyping of embedded QP applications on
the desktop with the Win32 API and with Qt. Among others, this
@@ -2093,9 +2078,7 @@ names for user-defined trace records
when the target resets. This allows QSPY to reset its internal state.
-
@section qpc_4_5_01 Version 4.5.01, Jun 14, 2012
-
The main purpose of this minor release is providing improved
MISRA-compliant state machine implementation. Specifically, a new
macro Q_UNHANDLED() has been added for a situation when a guard
@@ -2143,9 +2126,7 @@ slot function, but instead to allow defining this slot function in
the BSP of the application.
-
@section qpc_4_5_00 Version 4.5.00, May 29, 2012
-
The main pupose of this relase is to improve host-based development of QP
applications, which is critical for Test-Driven Development (TDD). Among
others, this release provides integration between QP and the popular
@@ -2222,9 +2203,7 @@ applications (DPP and PELICAN crossing).
P-threads, including QP ports and examples for Linux and Mac OS X.
-
@section qpc_4_4_01 Version 4.4.01, Mar 23, 2012
-
The relase fixes a bug in Q-SPY software tracing, which caused the
linking error: "QS_SIG_() not defined". This release also includes
a few cosmetic changes, which the Microchip C18 compiler didn't like.
@@ -2235,9 +2214,7 @@ a few cosmetic changes, which the Microchip C18 compiler didn't like.
qeq_get.c, qeq_init.c, and qa_get_.c.
-
@section qpc_4_4_00 Version 4.4.00, Jan 30, 2012
-
The main pupose of this relase is MISRA-C:2004 compliance, strong-type
checking compliance, update of PC-Lint option files and tests, and
general cleanup.
@@ -2296,9 +2273,7 @@ qpc/doc/, with the following Application notes:
"QP and ARM Cortex-M, and QP and Windows",
-
@section qpc_4_3_00 Version 4.3.00, Nov 01, 2011
-
1. This release changes the names of critical section macros and
introduces macros for unconditional interrupt disabling/enabling.
This is done to simplify and speed up the built-in Vanilla and QK
@@ -2329,9 +2304,7 @@ latest IAR EWARM version 6.30.
latest Sourcery CodeBench 2011.07-60.
-
@section qpc_4_2_04 Version 4.2.04, Sep 24, 2011
-
The main pupose of this relase is to provide a bug fix for the QK port
to ARM Cortex processors. The bug fix addresses a very rare and
undocumented behavior of late-arrival of an interrupt while entering
@@ -2346,13 +2319,11 @@ implemented in the qk_port.s file and consists of clearing the
PENDSVSET bit programmatically inside PendSV_Handler.
-
@section qpc_4_2_02 Version 4.2.02, Sep 08, 2011
-
1. The main pupose of this relase is to repackage the default QP/C
-distribution to contain the single root directory qpc/ in the
+distribution to contain the single root directory `qpc/` in the
archive. That way, unziping the archive will produce only one
-directory (qpc/), which can be then changed by the user.
+directory (`qpc/`), which can be then changed by the user.
2. This release also changes the ARM Cortex QP ports with GNU. The
suffix "_cs" has been added to all QP libraries generated by the
@@ -2361,9 +2332,7 @@ distinguish libraries generated by different GNU-toolchains (such
as CodeRed, Attolic, DevKit ARM, etc.)
-
@section qpc_4_2_01 Version 4.2.01, Aug 13, 2011
-
1. Modified file qassert.h to add assertion macros #Q_ASSERT_ID,
#Q_REQUIRE_ID, #Q_ENSURE_ID, #Q_INVARIANT_ID, and #Q_ERROR_ID,
which are better suited for unit testig, because they avoid the
@@ -2372,9 +2341,7 @@ volatility of line numbers for indentifying assertions.
2. Added QP port and examples for Mac OS X on 80x86.
-
@section qpc_4_2_00 Version 4.2.00, Jul 14, 2011
-
The goal of this milestone release is to extend the number of event
pools (theoretically up to 255 pools) instead of just three event
pools available up til now. Also, this release adds several
@@ -2444,9 +2411,7 @@ framework.
latest IAR EWARM 6.20.
-
@section qpc_4_1_07 Version 4.1.07, Feb 28, 2011
-
The goal of this release is to improve the ease of experimenting with
QP/C on the desktop. This release adds support for Windows (Win32) to
the baseline code. Two most popular compilers for Windows are supported:
@@ -2485,9 +2450,7 @@ on 64-bit targets (such as 64-bit Linux).
latest Sourcery G++ 2011.02-2.
-
@section qpc_4_1_06 Version 4.1.06, Jan 07, 2011
-
1. Made cosmetic improvements to the example QM models of the
"Fly 'n' Shoot" game.
@@ -2501,9 +2464,7 @@ IAR EWARM version 6.10.
latest Sourcery G++ 2010.09-66.
-
@section qpc_4_1_05 Version 4.1.05, Nov 01, 2010
-
This release is adds examples for the QM (QP Modeler) graphical modeling
and code generation tool. The examples are based on the "Fly 'n' Shoot"
game described in the QP/C Tutorial and in Chapter 1 of the PSiCC2 book.
@@ -2525,11 +2486,9 @@ Additionally, the QP/C baseline code has been slighlty modified for
better conformance to the MISRA C 2004 rules and the latest PC-Lint 9.x.
-
@section qpc_4_1_04 Version 4.1.04, Mar 16, 2010
-
This release is adds compatibility of all examples for DOS with the DOSBox
-emulator (http://www.dosbox.com/) that recreates a MS-DOS compatible
+emulator (http://www.dosbox.com) that recreates a MS-DOS compatible
environment on all versions of Windows, including 64-bit Windows that don't
run 16-bit DOS applications anymore.
@@ -2544,9 +2503,7 @@ improvement extends the CMSIS from Sandstorm to Fury, DustDevil, and Tempest
Stellaris families.
-
@section qpc_4_1_03 Version 4.1.03, Jan 21, 2010
-
This release is concerned with the ARM Cortex ports and examples.
Specifically, this release contains the following improvements:
@@ -2573,9 +2530,7 @@ any way, so the release has NO IMPACT on the QP/C applications except for the
ARM Cortex ports and applications.
-
@section qpc_4_1_02 Version 4.1.02, Jan 14, 2010
-
The purpose of this minor maintenance release is the change in the directory
structure for the ARM Cortex ports and examples. As new ARM Cortex cores are
becoming available, the old port name "cortex-m3" could be misleading, because
@@ -2588,9 +2543,7 @@ release has NO IMPACT on the QP/C applications except for the ARM Cortex
ports and applications.
-
@section qpc_4_1_01 Version 4.1.01, Nov 05, 2009
-
The main purpose of this release is to replace the Turbo C++ 1.01 toolset
with the Open Watcom C/C++ toolset, because Turbo C++ 1.01 is no longer
available for a free download. In contrast, Open Watcom is distributed under
@@ -2609,9 +2562,7 @@ state machine classes with QP 4.x. The SLS example located in
new State-Local Storage state design pattern.
-
@section qpc_4_1_00 Version 4.1.00, Oct 09, 2009
-
The release brings a number of improvements to QP/C and updates the QP/C ARM
Cortex-M3 examples for the EK-LM3S811 board to the latest IAR EWARM 5.40.
@@ -2651,14 +2602,12 @@ tools in different directories than those chosen by Quantum Leaps.
- modified the ARM Cortex-M3 examples for the new IAR EWARM 5.40.
- modified slighlty the Calculator example to allow extensibility.
- in the ARM Cortex-M3 port file qk_port.s added explicit testing of the
-QK_readySet_ set for empty condition. This test allows avoiding calling the QK
+QF_readySet_ set for empty condition. This test allows avoiding calling the QK
scheduler and two contex-switches if the ready-set is empty.
- in the game example moved setting up the QS filters from main.c to bsp.c.
-
@section qpc_4_0_04 Version 4.0.04, Apr 09, 2009
-
The maintenance release provides a fix for the compile-time assertions,
which did not work correctly for the GNU compiler family. Also, the ARM
Cortex-M3 examples have been recompiled with the newer IAR EWARM v5.30.
@@ -2672,9 +2621,7 @@ The main changes in QP v4.0.04 with respect to earlier version are as follows:
a negative array dimension when the asserted condition is not TRUE.
-
@section qpc_4_0_03 Version 4.0.03, Dec 27, 2008
-
The main purpose of this release is to fix a bug in the QK preemptive kernel,
which occurs only when the advanced QK features are used. Specifically, the QK
priority-ceiling mutex could interfere with QK thread-local storage (TLS) or
@@ -2708,9 +2655,7 @@ when the macro QK_NO_MUTEX is not defined.
when the macro QK_NO_MUTEX is not defined.
-
@section qpc_4_0_02 Version 4.0.02, Nov 15, 2008
-
This maintenance release does not change the QP/C API in any way, so the
release has NO IMPACT on the QP/C applications.
@@ -2723,9 +2668,7 @@ the PC-lint warining about using the comma-operator (MISRA rule 42).
HIT_WALL was not declared static.
-
@section qpc_4_0_01 Version 4.0.01, June 09, 2008
-
This maintenace release is made to allow using QS software tracing with
the GNU compiler for AVR (WinAVR). Specifically, the output of the strings
residing in ROM has been fixed.
@@ -2742,9 +2685,7 @@ as static to save stack space, because QF_run() never returns and is not
reentrant.
-
@section qpc_4_0_00 Version 4.0.00, Apr 07, 2008
-
This milestone release is made for the book /ref PSiCC2. The book describes in
great detail this new release. The older "QP Programmer's Manual" is now
phased out and is replaced with this hyper-linked
diff --git a/doxygen/images/an-oop_in_c.jpg b/doxygen/images/an-oop_in_c.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..458ccc2ec6a168ec67bf507aba387540e7c646f5
GIT binary patch
literal 48945
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